onRestart — Android-dagi Activity hayotiy sikli usuli boʻlib, tizim tomonidan Activity-ning Stopped holatidan Started holatiga qaytishidan oldin chaqiriladi. onRestart ilgari boshqa ekran tomonidan yashirilgan yoki fonga tushirilgan Activity foydalanuvchi uchun yana koʻrinadigan boʻlishini bildiradi. onRestart-da dasturchi eskirgan maʼlumotlarni yangilaydi, roʻyxatlarni qayta yuklaydi va Activity koʻrinmas boʻlgan vaqtda oʻzgargan boʻlishi mumkin boʻlgan UI holatini tiklaydi. Google Android Vitals (2025) maʼlumotlariga koʻra, onRestart-dan maʼlumotlarni yangilash uchun foydalanadigan ilovalar ekranga qaytganda 25% kamroq notoʻgʻri maʼlumot koʻrsatish holatlarini namoyish etadi. Android Developers hujjatlari onRestart-ni Activity ekranda qayta paydo boʻlishidan oldingi tayyorgarlik bosqichi sifatida tavsiflaydi.
Asosiy maʼlumotlar
onRestart — Android Activity koʻrinmas Stopped holatidan qaytib koʻrinadigan holatga oʻtganda, onStart-dan oldin chaqiradigan callback usulidir. Bu usul noyobdir, chunki u faqat Activity-ni qayta koʻrsatishda chaqiriladi — birinchi instansiya yaratishda ketma-ketlik onRestart-ni chetlab oʻtib, onCreate bilan boshlanadi. Toʻliq sikl: onCreate → onStart → onResume (birinchi ishga tushirish) yoki onRestart → onStart → onResume (qayta koʻrsatish).
Android tizimi nuqtai nazaridan onRestart Activity-ning qaytishga tayyorlanishiga imkon beruvchi optimallashtirishdir: repozitoriydan maʼlumotlarni yangilash, UI holatini sinxronlash, tarmoq ulanishini tekshirish. Fokus olganda har safar chaqiriladigan onResume-dan farqli oʻlaroq (shu jumladan dialog yoki tizim menyusidan qaytganda), onRestart faqat toʻliq yashirish-qaytish siklida ishga tushadi. Bu onRestart-ni qisman fokus yoʻqotishda kerak boʻlmagan „ogʻir“ yangilash operatsiyalari uchun ideal joyga aylantiradi.
Android Activity hayotiy sikli spetsifikatsiyasiga koʻra, onStop va onRestart oʻrtasidagi vaqt oraligʻi bir necha soniyadan (foydalanuvchi tez almashdi) bir necha soatgacha (ilova fonda edi va foydalanuvchi qaytdi) oʻzgarishi mumkin. Bu vaqt davomida uzoq manbadagi (API, DB) maʼlumotlar oʻzgargan boʻlishi mumkin, shuning uchun onRestart dolzarblikni tekshirish uchun tabiiy nuqtadir.
onRestart faqat Activity-ning Stopped holatidan qaytishida chaqiriladi, Activity onStop chaqirilgandan soʻng Stopped holatiga oʻtadi. Quyida onRestart-ga olib keladigan barcha stsenariylar keltirilgan.
onRestart chaqirilish stsenariylari:
onRestart qachon chaqirilmaydi: ekran aylantirishda (Activity yoʻq qilinadi va onCreate orqali qayta yaratiladi), dialog oynasidan qaytishda (Activity onStop-ga bormaydi, faqat onPause → onResume), process death vaqtida (Activity qayta yaratiladi).
onRestart va onCreate Activity-ni tiklashga ikki xil yondashuvdir. Ularning oʻrtasida tanlov Activity butunlay yoʻq qilinganmi yoki shunchaki yashirilganmi, bunga bogʻliq.
| Xususiyat | onRestart | onCreate |
|---|---|---|
| Qachon chaqiriladi | Activity Stopped-dan qaytadi | Activity birinchi marta yoki yoʻq qilingandan keyin yaratiladi |
| Holat saqlangan | Ha — ViewModel va maydonlar tirik | Yoʻq — hamma narsa qayta yaratiladi |
| Bundle | Uzatilmaydi | Uzatiladi (savedInstanceState) |
| Oddiy harakatlar | Maʼlumot yangilash, UI yangilash | View-ni ishga tushirish, LiveData-ga obuna |
| Chaqirilish chastotasi | Har bir qaytishda | Bir marta yoki yoʻq qilingandan keyin |
Tanlov qoidasi: View-ni ishga tushirish va LiveData/StateFlow-ga obunani onCreate-da (yoki Fragment uchun onViewCreated-da) bajaring. Maʼlumot yangilash, roʻyxatlarni qayta yuklash va holatni tekshirishni — onRestart-da. Agar maʼlumotlar ViewModel orqali yuklansa, onRestart shunchaki ViewModel-da refresh() usulini chaqirishi mumkin, View esa reaktiv oqim orqali yangilangan maʼlumotlarga obuna boʻladi.
Google tavsiya qiladi: onCreate mantiqini onRestart-da takrorlamang. ViewModel-da joriy maʼlumotlarni yuklaydigan refresh() usullarini ajrating va ularni onRestart-da chaqiring. Bu MVVM arxitekturasining tozaligini saqlaydi va kod takrorlanishini bartaraf etadi.
onRestart — ekranga har bir qaytishda bajarilishi kerak boʻlgan, lekin birinchi ochilishda kerak boʻlmagan operatsiyalar uchun ideal joy. Oddiy stsenariylar:
viewModel.refreshItems() ni chaqiring.onRestart-da nima qilmaslik kerak: View-larni qayta ishga tushirmang — ular tirik, chunki Activity yoʻq qilinmagan. LiveData-ga qayta obuna boʻlmang — obuna onCreate-da tirik. Yangi fragmentlar yaratmang — ular allaqachon FragmentManager-da.
Eng muhim istisno: onRestart tizim tomonidan ilova jarayoni oʻldirilganda chaqirilmaydi. Bu dasturchilar koʻpincha holatni tiklash uchun onRestart-ga tayanib, eʼtibordan chetda qoldiradigan asosiy nuqtadir.
Process death vaqtida:
Bundan qanday himoyalanish: muhim holatni har doim onSaveInstanceState(Bundle) da saqlang (onStop-dan oldin chaqiriladi) yoki ViewModel-da SavedStateHandle dan foydalaning. onCreate-da savedInstanceState-ni tekshiring: agar null boʻlmasa, holatni Bundle-dan tiklang, agar null boʻlsa — yangi maʼlumotlarni yuklang.
Google Android Vitals-ga koʻra, fonda uzoq vaqt qolgandan keyin Activity-ga qaytishlarning taxminan 7% process death-dan keyin sodir boʻladi. Bu onRestart-ni chaqirishi kerak boʻlgan har 15- Activity aslida onCreate-dan oʻtishini anglatadi. Ushbu stsenariyni eʼtiborsiz qoldirish „qaytgandan keyin boʻsh ekran“ xatolarining asosiy sabablaridan biridir.
Activity tahrirlash ekranidan qaytgandan keyin vazifalar roʻyxatini yangilash uchun onRestart-da viewModel.refreshTasks() ni chaqiradi.
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} ta vazifa olindi")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: vazifalar roʻyxatini yangilash")
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() repozitoriydan joriy maʼlumotlarni yuklaydi. LiveData avtomatik ravishda Activity-ni maʼlumot oʻzgarishi haqida xabardor qiladi — UI qoʻshimcha kodlarsiz yangilanadi. OnRestart yangi obuna yaratmaydi — u allaqachon onCreate-da oʻrnatilgan.
Activity qaytishda tokenning haqiqiyligini tekshiradi va kerak boʻlsa, kirish sahifasiga yoʻnaltiradi.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Kirish ekranidan qaytildi") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token muddati tugadi — kirishga yoʻnaltirish")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Agar foydalanuvchi ilovani uzoq vaqtga kichraytirgan boʻlsa va token muddati oʻtgandan keyin qaytgan boʻlsa, onRestart uni kirish ekraniga yoʻnaltiradi. Bu muddati oʻtgan token bilan soʻrovni bajarishga urinishda API xatolarining oldini oladi. Diqqat: tekshirish onRestart-da, onResume-da emas — dialogdan qaytishda keraksiz tekshirishning oldini olish uchun.
Fragment maʼlumot yangilash uchun LifecycleObserver orqali onRestart-dan foydalanadi.
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", "LifecycleObserver orqali onRestart")
viewModel.refreshFeed()
}
})
}
}
Fragment-da onRestart-ni bekor qilish oʻrniga LifecycleObserver ishlatiladi — merosxoʻrliksiz hayotiy sikl hodisalariga mantiq qoʻshish imkonini beruvchi moslashuvchan yondashuv. ViewLifecycleOwner observer-ning View doirasida yashashini kafolatlaydi (onDestroyView-dan omon qolmaydi).
Koʻp beriladigan savollar
onResume Activity fokus olganda har safar chaqiriladi — shu jumladan dialog yoki tizim menyusidan qaytganda (Activity onStop-ga bormagan). onRestart faqat Activity toʻliq yashirilganda Stopped holatidan qaytganda chaqiriladi. onRestart „ogʻir“ yangilanishlar uchun torroq hodisa, onResume esa engil operatsiyalar uchun (sarlavha oʻzgartirish, vaqtni yangilash).
Yoʻq, mumkin emas. onRestart onStop bilan juftlashgan usul: onRestart faqat Activity onStop-dan oʻtgandan keyin chaqiriladi. Activity onStop-ga bormagan boʻlsa (masalan, dialog oynasi ochiq), qaytishda onRestart chaqirilmaydi — faqat onResume.
Emulyatorda Home tugmasini bosing — Activity kichrayadi, onStop oladi. Keyin ilovani Recent Apps yoki launcher orqali oching — Activity onRestart → onStart → onResume oladi. Nosozliklarni tuzatish uchun Debug rejimidan onRestart-da toʻxtash nuqtalari bilan yoki Log.d Activity tegi bilan foydalaning.
onRestart-da ushlanmagan istisno Force Close-ga olib keladi. Tizim hayotiy sikl callback-larida istisnolarni ushlamaydi. Agar onRestart-da istisno chiqarishi mumkin boʻlgan operatsiyalar bajarilsa (try-catchsiz tarmoq soʻrovi, null View bilan ishlash), ularni try-catch bilan oʻrab oling.
Yoʻq. onRestart faqat Stopped holatidan qaytadigan tirik Activity-lar uchun chaqiriladi. isFinishing() onRestart-da har doim false boʻladi. isFinishing() tekshiruvi onPause (maʼlumotlarni saqlash) va onDestroy (qayta yaratishni finish()-dan farqlash) da maʼnoga ega.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.