onRestart — ماهیت، بازیابی Activity در چرخه حیات

نویسنده: IT Sectr منتشر شده: 2026-03-04 زمان مطالعه: 8 دقیقه

onRestart — متد چرخه حیات Activity در Android است که توسط سیستم قبل از بازگشت Activity از حالت Stopped به حالت Started فراخوانی می‌شود. onRestart نشان می‌دهد که Activity که قبلاً توسط صفحه دیگری پنهان یا به پس‌زمینه رفته بود، دوباره برای کاربر قابل مشاهده می‌شود. در onRestart توسعه‌دهنده داده‌های قدیمی را به‌روزرسانی می‌کند، لیست‌ها را مجدداً بارگذاری می‌کند و وضعیت UI را که ممکن است در زمانی که Activity نامرئی بود تغییر کرده باشد، بازیابی می‌کند. طبق Google Android Vitals (2025)، برنامه‌هایی که از onRestart برای به‌روزرسانی داده‌ها استفاده می‌کنند، 25% موارد کمتری از نمایش نادرست اطلاعات هنگام بازگشت به صفحه نشان می‌دهند. مستندات Android Developers onRestart را به عنوان مرحله آماده‌سازی قبل از ظاهر شدن دوباره Activity روی صفحه توصیف می‌کند.

نکات اصلی

  • onRestart هنگام بازگشت Activity از حالت Stopped، قبل از onStart و onResume فراخوانی می‌شود.
  • onRestart در اولین ایجاد Activity فراخوانی نمی‌شود — فقط در نمایش مجدد پس از پنهان شدن.
  • وظیفه اصلی onRestart به‌روزرسانی داده‌هایی است که ممکن است در زمانی که Activity نامرئی بود تغییر کرده باشند.
  • onRestart در process death فراخوانی نمی‌شود — در این حالت Activity از طریق onCreate دوباره ایجاد می‌شود.
  • استفاده صحیح از onRestart تجربه کاربری را در چندوظیفه‌ای و جابه‌جایی بین برنامه‌ها بهبود می‌بخشد.

onRestart — ماهیت متد در چرخه حیات Android

onRestart — متد callback است که Android دقیقاً قبل از onStart، زمانی که Activity از حالت نامرئی Stopped به حالت قابل مشاهده بازمی‌گردد، فراخوانی می‌کند. این متد منحصر به فرد است زیرا فقط در نمایش مجدد Activity فراخوانی می‌شود — در اولین ایجاد نمونه، توالی با onCreate شروع می‌شود و onRestart را رد می‌کند. چرخه کامل: onCreate → onStart → onResume (اولین راه‌اندازی) یا onRestart → onStart → onResume (نمایش مجدد).

از دیدگاه سیستم Android، onRestart بهینه‌سازی است که به Activity اجازه می‌دهد برای بازگشت آماده شود: داده‌ها را از مخزن به‌روزرسانی کند، وضعیت UI را همگام‌سازی کند، اتصال شبکه را بررسی کند. برخلاف onResume که هر بار هنگام دریافت فوکوس فراخوانی می‌شود (از جمله هنگام بازگشت از دیالوگ یا منوی سیستم)، onRestart فقط در چرخه کامل پنهان‌شدن-بازگشت فعال می‌شود. این باعث می‌شود onRestart مکان ایده‌آلی برای عملیات به‌روزرسانی «سنگین» باشد که در از دست دادن جزئی فوکوس ضروری نیستند.

طبق مشخصات چرخه حیات Android Activity، فاصله زمانی بین onStop و onRestart می‌تواند از چند ثانیه (کاربر سریعاً سوئیچ کرد) تا چند ساعت (برنامه در پس‌زمینه بود و کاربر بازگشت) متغیر باشد. در این مدت داده‌های منبع راه دور (API، DB) ممکن است تغییر کرده باشند، بنابراین onRestart نقطه طبیعی برای بررسی به‌روزرسانی است.

چه زمانی onRestart فراخوانی می‌شود: شرایط و ترتیب

onRestart فقط هنگام بازگشت Activity از حالت Stopped فراخوانی می‌شود، Activity پس از فراخوانی onStop وارد حالت Stopped می‌شود. در زیر تمام سناریوهای منجر به onRestart فهرست شده است.

سناریوهای فراخوانی onRestart:

  • بازگشت از Activity دیگر — کاربر یک Activity جدید باز کرد (مثلاً روی اعلان کلیک کرد) و سپس بازگشت (دکمه «بازگشت» را فشار داد). پشته: MainActivity.onPause → MainActivity.onStop → SecondActivity ایجاد می‌شود → کاربر «بازگشت» را فشار می‌دهد → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • بازگشت از کوچک‌سازی — کاربر برنامه را کوچک کرد (Home) و پس از مدتی بازگشت. CurrentActivity.onPause → CurrentActivity.onStop → (برنامه در پس‌زمینه) → کاربر بازمی‌گردد → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • بازگشت از صفحه قفل — صفحه قفل Activity را می‌پوشاند؛ پس از باز کردن قفل، Activity onRestart دریافت می‌کند اگر زمان قابل توجهی (بیش از ۵ ثانیه) گذشته باشد.
  • بازگشت از برنامه راه‌اندازی شده از طریق Intent — دوربین، گالری، مرورگر — هر برنامه شخص ثالثی که از طریق startActivityForResult() یا ActivityResultLauncher راه‌اندازی شده است.

چه زمانی onRestart فراخوانی نمی‌شود: هنگام چرخش صفحه (Activity نابود و از طریق onCreate دوباره ایجاد می‌شود)، هنگام بازگشت از پنجره دیالوگ (Activity به onStop نمی‌رود، فقط onPause → onResume)، در process death (Activity دوباره ایجاد می‌شود).

تفاوت onRestart و onCreate: کدام را انتخاب کنیم

onRestart و onCreate دو رویکرد متفاوت برای بازیابی Activity هستند. انتخاب بین آنها بستگی به این دارد که آیا Activity کاملاً نابود شده یا فقط پنهان شده است.

ویژگیonRestartonCreate
چه زمانی فراخوانی می‌شودActivity از Stopped بازمی‌گرددActivity برای اولین بار یا پس از نابودی ایجاد می‌شود
وضعیت ذخیره شدهبله — ViewModel و فیلدها زنده هستندخیر — همه چیز دوباره ایجاد می‌شود
Bundleارسال نمی‌شودارسال می‌شود (savedInstanceState)
اقدامات معمولبه‌روزرسانی داده، تازه‌سازی UIراه‌اندازی View، اشتراک LiveData
دفعات فراخوانیهر بار هنگام بازگشتیک بار یا پس از نابودی

قانون انتخاب: راه‌اندازی View و اشتراک LiveData/StateFlow را در onCreate (یا onViewCreated برای Fragment) انجام دهید. به‌روزرسانی داده، بارگذاری مجدد لیست‌ها و بررسی وضعیت — در onRestart. اگر داده‌ها از طریق ViewModel بارگذاری می‌شوند، onRestart می‌تواند به سادگی متد refresh() را روی ViewModel فراخوانی کند و View از طریق جریان واکنشی روی داده‌های به‌روزرسانی شده مشترک می‌شود.

Google توصیه می‌کند: منطق onCreate را در onRestart تکرار نکنید. متدهای refresh() را در ViewModel جدا کنید که داده‌های جاری را بارگذاری می‌کنند و آنها را در onRestart فراخوانی کنید. این کار خلوص معماری MVVM را حفظ می‌کند و تکرار کد را حذف می‌کند.

سناریوهای استفاده از onRestart: به‌روزرسانی داده و UI

onRestart — مکان ایده‌آل برای عملیاتی است که باید در هر بازگشت به صفحه انجام شوند، اما در اولین باز شدن ضروری نیستند. در اینجا سناریوهای معمول آورده شده است:

  • به‌روزرسانی لیست از DB یا API — کاربر به Activity دیگر رفت، داده‌ها را تغییر داد، بازگشت — لیست باید به‌روز باشد. viewModel.refreshItems() را در onRestart فراخوانی کنید.
  • بررسی احراز هویت — اگر Activity برای مدت طولانی پنهان بود، توکن دسترسی ممکن است منقضی شده باشد. onRestart نقطه‌ای برای بررسی اعتبار توکن و هدایت به صفحه ورود است.
  • همگام‌سازی وضعیت UI — تغییر تم، تغییر زبان، به‌روزرسانی تنظیمات — تغییرات باید هنگام بازگشت به صفحه اعمال شوند.
  • بارگذاری مجدد رسانه — اگر Activity محتوایی را نمایش می‌دهد که ممکن است تغییر کرده باشد (فید خبری، نرخ ارز، آب و هوا)، داده‌ها را در onRestart به‌روز کنید.
  • بررسی اتصال شبکه — هنگام بازگشت از حالت آفلاین، Activity باید دسترسی به شبکه را بررسی کرده و UI را تغییر دهد.
  • بازیابی انیمیشن‌ها — انیمیشن‌های آزاد شده در onStop را قبل از onStart در onRestart مجدداً راه‌اندازی کنید.

در onRestart چه کاری انجام ندهید: Viewها را دوباره راه‌اندازی نکنید — آنها زنده هستند زیرا Activity نابود نشده است. دوباره در LiveData مشترک نشوید — اشتراک در onCreate زنده است. Fragmentهای جدید ایجاد نکنید — آنها در FragmentManager هستند.

onRestart و process death: استثنای مهم

مهمترین استثنا: onRestart فراخوانی نمی‌شود اگر فرآیند برنامه توسط سیستم کشته شده باشد. این نکته کلیدی است که توسعه‌دهندگان اغلب با تکیه بر onRestart برای بازیابی وضعیت از آن غافل می‌شوند.

در process death:

  • برنامه در پس‌زمینه بود، Android فرآیند را برای آزادسازی حافظه کشت.
  • کاربر بازمی‌گردد — سیستم یک فرآیند جدید راه‌اندازی می‌کند.
  • Activity دوباره ایجاد می‌شود: onCreate(Bundle) → onStart → onResume.
  • onRestart فراخوانی نمی‌شود — برای سیستم این یک نمونه جدید از Activity است.

چگونه از این محافظت کنیم: همیشه وضعیت بحرانی را در onSaveInstanceState(Bundle) ذخیره کنید (قبل از onStop فراخوانی می‌شود) یا از SavedStateHandle در ViewModel استفاده کنید. در onCreate savedInstanceState را بررسی کنید: اگر null نیست، وضعیت را از Bundle بازیابی کنید، اگر null است — داده‌های تازه بارگذاری کنید.

طبق Google Android Vitals، حدود 7% بازگشت‌ها به Activity پس از اقامت طولانی در پس‌زمینه پس از process death رخ می‌دهد. این بدان معناست که هر ۱۵مین Activity که باید onRestart را فراخوانی کند، در واقع از onCreate عبور می‌کند. نادیده گرفتن این سناریو یکی از دلایل اصلی باگ‌های «صفحه خالی پس از بازگشت» است.

نمونه‌های کد با onRestart در Kotlin

مثال ۱: onRestart با به‌روزرسانی لیست از طریق ViewModel

Activity برای به‌روزرسانی لیست وظایف پس از بازگشت از صفحه ویرایش، viewModel.refreshTasks() را در onRestart فراخوانی می‌کند.

kotlin
class TaskListActivity : AppCompatActivity() {
    private val viewModel: TaskViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_task_list)
        viewModel.tasks.observe(this) { tasks ->
            Log.d("TaskList", "${tasks.size} وظیفه دریافت شد")
        }
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("TaskList", "onRestart: به‌روزرسانی لیست وظایف")
        viewModel.refreshTasks()
    }
}

class TaskViewModel : ViewModel() {
    private val _tasks = MutableLiveData<List<Task>>()
    val tasks: LiveData<List<Task>> get() = _tasks

    fun refreshTasks() {
        viewModelScope.launch {
            _tasks.value = TaskRepository().getAllTasks()
        }
    }
}

ViewModel.refreshTasks() داده‌های جاری را از مخزن بارگذاری می‌کند. LiveData به طور خودکار Activity را از تغییر داده مطلع می‌کند — UI بدون کد اضافی به‌روزرسانی می‌شود. OnRestart اشتراک جدیدی ایجاد نمی‌کند — قبلاً در onCreate تنظیم شده است.

مثال ۲: onRestart با بررسی احراز هویت

Activity اعتبار توکن را هنگام بازگشت بررسی می‌کند و در صورت نیاز به صفحه ورود هدایت می‌کند.

kotlin
class ProfileActivity : AppCompatActivity() {
    private val authManager = AuthManager()
    private val launcher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { Log.d("Profile", "از صفحه ورود بازگشتیم") }

    override fun onRestart() {
        super.onRestart()
        if (!authManager.isTokenValid()) {
            Log.d("Profile", "توکن منقضی شد — هدایت به ورود")
            launcher.launch(Intent(this, LoginActivity::class.java))
        }
    }
}

class AuthManager {
    fun isTokenValid(): Boolean {
        val expiry = SharedPreferencesManager().getTokenExpiry()
        return System.currentTimeMillis() < expiry
    }
}

اگر کاربر برنامه را برای مدت طولانی کوچک کرده و پس از انقضای توکن بازگشته باشد، onRestart او را به صفحه ورود هدایت می‌کند. این کار از خطاهای API هنگام تلاش برای انجام درخواست با توکن منقضی شده جلوگیری می‌کند. توجه: بررسی در onRestart، نه در onResume، برای جلوگیری از بررسی غیرضروری هنگام بازگشت از دیالوگ.

مثال ۳: onRestart در Fragment با ViewLifecycleOwner

Fragment از onRestart از طریق LifecycleObserver برای به‌روزرسانی داده‌ها استفاده می‌کند.

kotlin
class FeedFragment : Fragment() {
    private val viewModel: FeedViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
            fun onRestart() {
                Log.d("FeedFragment", "onRestart از طریق LifecycleObserver")
                viewModel.refreshFeed()
            }
        })
    }
}

به جای بازنویسی onRestart در Fragment، از LifecycleObserver استفاده می‌شود — رویکردی انعطاف‌پذیرتر که امکان افزودن منطق به رویدادهای چرخه حیات بدون وراثت را فراهم می‌کند. ViewLifecycleOwner تضمین می‌کند که observer در محدوده View زندگی می‌کند (بیشتر از onDestroyView عمر نمی‌کند).

سوالات متداول

تفاوت onRestart با onResume چیست؟

onResume هر بار که Activity فوکوس دریافت می‌کند فراخوانی می‌شود — از جمله هنگام بازگشت از دیالوگ یا منوی سیستم (Activity به onStop نرفته است). onRestart فقط هنگام بازگشت از حالت Stopped، زمانی که Activity کاملاً پنهان بوده، فراخوانی می‌شود. onRestart رویداد محدودتری برای به‌روزرسانی‌های «سنگین» است، onResume برای عملیات سبک (تغییر عنوان، به‌روزرسانی زمان).

آیا onRestart می‌تواند بدون onStop فراخوانی شود؟

خیر، نمی‌تواند. onRestart متد زوج onStop است: onRestart فقط پس از عبور Activity از onStop فراخوانی می‌شود. اگر Activity به onStop نرفته باشد (مثلاً پنجره دیالوگ باز است)، هنگام بازگشت onRestart فراخوانی نمی‌شود — فقط onResume.

چگونه onRestart را در شبیه‌ساز شبیه‌سازی کنیم؟

دکمه Home را در شبیه‌ساز فشار دهید — Activity کوچک می‌شود، onStop دریافت می‌کند. سپس برنامه را از Recent Apps یا launcher باز کنید — Activity onRestart → onStart → onResume دریافت می‌کند. برای دیباگ از Debug با نقاط توقف در onRestart یا Log.d با تگ Activity استفاده کنید.

اگر در onRestart استثنا پرتاب شود چه اتفاقی می‌افتد؟

استثنای گرفته نشده در onRestart باعث Force Close می‌شود. سیستم استثناها را در callbackهای چرخه حیات نمی‌گیرد. اگر در onRestart عملیاتی انجام می‌شود که ممکن است استثنا پرتاب کند (درخواست شبکه بدون try-catch، کار با View نال)، آنها را در try-catch قرار دهید.

آیا باید isFinishing() را در onRestart بررسی کرد؟

خیر. onRestart فقط برای Activityهای زنده که از حالت Stopped بازمی‌گردند فراخوانی می‌شود. isFinishing() در onRestart همیشه false خواهد بود. بررسی isFinishing() در onPause (ذخیره داده) و onDestroy (تشخیص بازآفرینی از finish()) معنا دارد.

خلاصه

  • onRestart — متد چرخه حیات که هنگام بازگشت Activity از حالت Stopped، قبل از onStart و onResume فراخوانی می‌شود.
  • onRestart در اولین ایجاد Activity فراخوانی نمی‌شود — فقط در نمایش مجدد پس از پنهان شدن کامل.
  • هدف اصلی onRestart به‌روزرسانی داده‌های قدیمی و بررسی وضعیت است (توکن، شبکه، تنظیمات).
  • onRestart در process death فراخوانی نمی‌شود — از onCreate با Bundle برای بازیابی پس از کشته شدن فرآیند استفاده کنید.
  • منطق onCreate را در onRestart تکرار نکنید: راه‌اندازی را در onCreate، به‌روزرسانی را در onRestart انجام دهید.
  • برای Fragment به جای بازنویسی onRestart از LifecycleObserver در viewLifecycleOwner استفاده کنید.
  • پیاده‌سازی صحیح onRestart UX را در چندوظیفه‌ای بهبود می‌بخشد و از نمایش داده‌های قدیمی جلوگیری می‌کند.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید