onRestart — متد چرخه حیات Activity در Android است که توسط سیستم قبل از بازگشت Activity از حالت Stopped به حالت Started فراخوانی میشود. onRestart نشان میدهد که Activity که قبلاً توسط صفحه دیگری پنهان یا به پسزمینه رفته بود، دوباره برای کاربر قابل مشاهده میشود. در onRestart توسعهدهنده دادههای قدیمی را بهروزرسانی میکند، لیستها را مجدداً بارگذاری میکند و وضعیت UI را که ممکن است در زمانی که Activity نامرئی بود تغییر کرده باشد، بازیابی میکند. طبق Google Android Vitals (2025)، برنامههایی که از onRestart برای بهروزرسانی دادهها استفاده میکنند، 25% موارد کمتری از نمایش نادرست اطلاعات هنگام بازگشت به صفحه نشان میدهند. مستندات Android Developers onRestart را به عنوان مرحله آمادهسازی قبل از ظاهر شدن دوباره Activity روی صفحه توصیف میکند.
نکات اصلی
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 فقط هنگام بازگشت Activity از حالت Stopped فراخوانی میشود، Activity پس از فراخوانی onStop وارد حالت Stopped میشود. در زیر تمام سناریوهای منجر به onRestart فهرست شده است.
سناریوهای فراخوانی onRestart:
چه زمانی onRestart فراخوانی نمیشود: هنگام چرخش صفحه (Activity نابود و از طریق onCreate دوباره ایجاد میشود)، هنگام بازگشت از پنجره دیالوگ (Activity به onStop نمیرود، فقط onPause → onResume)، در process death (Activity دوباره ایجاد میشود).
onRestart و onCreate دو رویکرد متفاوت برای بازیابی Activity هستند. انتخاب بین آنها بستگی به این دارد که آیا Activity کاملاً نابود شده یا فقط پنهان شده است.
| ویژگی | onRestart | onCreate |
|---|---|---|
| چه زمانی فراخوانی میشود | 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 — مکان ایدهآل برای عملیاتی است که باید در هر بازگشت به صفحه انجام شوند، اما در اولین باز شدن ضروری نیستند. در اینجا سناریوهای معمول آورده شده است:
viewModel.refreshItems() را در onRestart فراخوانی کنید.در onRestart چه کاری انجام ندهید: Viewها را دوباره راهاندازی نکنید — آنها زنده هستند زیرا Activity نابود نشده است. دوباره در LiveData مشترک نشوید — اشتراک در onCreate زنده است. Fragmentهای جدید ایجاد نکنید — آنها در FragmentManager هستند.
مهمترین استثنا: onRestart فراخوانی نمیشود اگر فرآیند برنامه توسط سیستم کشته شده باشد. این نکته کلیدی است که توسعهدهندگان اغلب با تکیه بر onRestart برای بازیابی وضعیت از آن غافل میشوند.
در process death:
چگونه از این محافظت کنیم: همیشه وضعیت بحرانی را در onSaveInstanceState(Bundle) ذخیره کنید (قبل از onStop فراخوانی میشود) یا از SavedStateHandle در ViewModel استفاده کنید. در onCreate savedInstanceState را بررسی کنید: اگر null نیست، وضعیت را از Bundle بازیابی کنید، اگر null است — دادههای تازه بارگذاری کنید.
طبق Google Android Vitals، حدود 7% بازگشتها به Activity پس از اقامت طولانی در پسزمینه پس از process death رخ میدهد. این بدان معناست که هر ۱۵مین Activity که باید onRestart را فراخوانی کند، در واقع از onCreate عبور میکند. نادیده گرفتن این سناریو یکی از دلایل اصلی باگهای «صفحه خالی پس از بازگشت» است.
Activity برای بهروزرسانی لیست وظایف پس از بازگشت از صفحه ویرایش، viewModel.refreshTasks() را در onRestart فراخوانی میکند.
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 تنظیم شده است.
Activity اعتبار توکن را هنگام بازگشت بررسی میکند و در صورت نیاز به صفحه ورود هدایت میکند.
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، برای جلوگیری از بررسی غیرضروری هنگام بازگشت از دیالوگ.
Fragment از onRestart از طریق LifecycleObserver برای بهروزرسانی دادهها استفاده میکند.
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 عمر نمیکند).
سوالات متداول
onResume هر بار که Activity فوکوس دریافت میکند فراخوانی میشود — از جمله هنگام بازگشت از دیالوگ یا منوی سیستم (Activity به onStop نرفته است). onRestart فقط هنگام بازگشت از حالت Stopped، زمانی که Activity کاملاً پنهان بوده، فراخوانی میشود. onRestart رویداد محدودتری برای بهروزرسانیهای «سنگین» است، onResume برای عملیات سبک (تغییر عنوان، بهروزرسانی زمان).
خیر، نمیتواند. onRestart متد زوج onStop است: onRestart فقط پس از عبور Activity از onStop فراخوانی میشود. اگر Activity به onStop نرفته باشد (مثلاً پنجره دیالوگ باز است)، هنگام بازگشت onRestart فراخوانی نمیشود — فقط onResume.
دکمه Home را در شبیهساز فشار دهید — Activity کوچک میشود، onStop دریافت میکند. سپس برنامه را از Recent Apps یا launcher باز کنید — Activity onRestart → onStart → onResume دریافت میکند. برای دیباگ از Debug با نقاط توقف در onRestart یا Log.d با تگ Activity استفاده کنید.
استثنای گرفته نشده در onRestart باعث Force Close میشود. سیستم استثناها را در callbackهای چرخه حیات نمیگیرد. اگر در onRestart عملیاتی انجام میشود که ممکن است استثنا پرتاب کند (درخواست شبکه بدون try-catch، کار با View نال)، آنها را در try-catch قرار دهید.
خیر. onRestart فقط برای Activityهای زنده که از حالت Stopped بازمیگردند فراخوانی میشود. isFinishing() در onRestart همیشه false خواهد بود. بررسی isFinishing() در onPause (ذخیره داده) و onDestroy (تشخیص بازآفرینی از finish()) معنا دارد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید