onStart — Android hayot siklining metodi bo'lib, Activity yoki Fragment foydalanuvchi uchun ko'rinadigan bo'lganda chaqiriladi. Shu momentda ekran qurilma displeyida paydo bo'ladi, lekin hali foydalanuvchi bilan o'zaro aloqada bo'la olmaydi — kiritish fokusi onResume chaqirilgunga qadar mavjud emas. onStart metodi tizim tinglovchilarini ro'yxatdan o'tkazish, geolokatsiya xizmatlariga ulanish va komponent ekranda ko'rinadigan bo'lgan vaqtda ishlashi kerak bo'lgan animatsiyalarni boshlash uchun idealdir. Activity-ning to'liq hayot sikli haqida Activity Lifecycle maqolasida o'qing.
Asosiy
onStart — Activity hayot siklining ikkinchi metodi bo'lib, tizim tomonidan onCreate-dan keyin (yoki to'xtatilgan holatdan qaytganda onRestart-dan keyin) chaqiriladi. onStart chaqirilgan momentda Activity yoki Fragment ekranda ko'rinadigan bo'ladi. Foydalanuvchi interfeysni ko'radi, lekin ekran hali o'zaro aloqaga tayyor emas — kiritish fokusi faqat onResume-dan keyin paydo bo'ladi.
onStart metodi Activity-ning «ko'rinadigan hayoti» (visible lifetime) tarkibiga kiradi — onStart va onStop orasidagi interval. Bu davrda Activity boshqa oynalar (masalan, shaffof Activity yoki dialog oynasi) tomonidan qisman yopilishi mumkin, lekin uning UI ko'rinadigan bo'lib qoladi. Bu ko'rinadigan hayotni Activity to'liq fokusga ega bo'lgan «old plandagi hayot» (onResume — onPause) dan farqlaydi.
Ushbu uch darajali ierarxiyani tushunish kodni to'g'ri taqsimlash uchun juda muhimdir. onCreate — bir martalik ishga tushirish, onStart — ko'rinadigan resurslarni ulash, onResume — eksklyuziv resurslarga monopol kirish. Bu darajalarni chalkashtirgan dasturchi xotira oqishlari yoki ekranlar o'rtasida o'tishda noto'g'ri xatti-harakatlar xavfini tug'diradi.
Activity-da onStart metodi ekran displeyda har paydo bo'lganda chaqiriladi — ham birinchi ishga tushirishda (onCreate-dan keyin), ham fon rejimidan qaytganda (onRestart-dan keyin). onCreate-dan farqli o'laroq, onStart Activity namunasi hayoti davomida bir necha marta chaqirilishi mumkin, shuning uchun ekran har paydo bo'lganda bajarilishi kerak bo'lgan kod shu joyga joylashtiriladi.
class DashboardActivity : AppCompatActivity() {
private val connectivityReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isConnected = ... // ConnectivityManager tekshiruvi
binding?.statusIndicator?.setColor(
if (isConnected) Color.GREEN else Color.RED
)
}
}
override fun onStart() {
super.onStart()
registerReceiver(
connectivityReceiver,
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
)
SensorManager.getInstance().registerStepCounter()
}
override fun onStop() {
unregisterReceiver(connectivityReceiver)
SensorManager.getInstance().unregisterStepCounter()
super.onStop()
}
}
Asosiy qoida: onStart-da ulangan barcha resurslar onStop-da bo'shatilishi kerak. Bu Activity ekrandan yashiringanda batareyani sarflamasligini, tizim hodisalarini tinglamasligini va xotirani band qilmasligini kafolatlaydi. Android Studio BroadcastReceiver-ni tegishli chiqishsiz ro'yxatdan o'tkazish haqida ogohlantiruvchi lint qoidalariga ega.
Fragment-da onStart konteyner Activity-ning hayot sikli bilan chambarchas bog'liq. Fragment onStart chaqiruvini faqat uni o'z ichiga olgan Activity onStart olganidan keyin oladi. Biroq, Fragment kechiktirilgan rejimda qo'shilgan bo'lsa (FragmentTransaction.commit() addToBackStack holda), onStart kechikish bilan chaqirilishi mumkin.
class MapFragment : Fragment() {
private var mapView: MapView? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
mapView = MapView(requireContext())
return mapView!!
}
override fun onStart() {
super.onStart()
mapView?.onStart()
LocationService.connect(requireContext())
}
override fun onStop() {
mapView?.onStop()
LocationService.disconnect()
super.onStop()
}
}
Fragment.onStart ning o'ziga xosligi: agar Fragment offscreenPageLimit = 1 bo'lgan ViewPager-da joylashgan bo'lsa, qo'shni fragmentlar ham ko'rinadigan bo'lishdan oldin onStart oladi. Bu tinglovchilarning muddatidan oldin ro'yxatdan o'tishiga olib kelishi mumkin. Bunday hollarda setUserVisibleHint() metodi yoki onStart ichida isVisible tekshiruvi orqali tinglovchilarni faqat haqiqatda ko'rinadigan fragmentlar uchun ro'yxatdan o'tkazing.
onStart va onResume o'rtasidagi asosiy farq — ekran faollik darajasi. onStart Activity ekranda ko'rinadigan, lekin old planda bo'lishi shart emasligini bildiradi. onResume Activity old planda va kiritish fokusiga ega ekanligini bildiradi. Farq dialog oynasi misolida ko'rsatilgan: Activity ustida Dialog paydo bo'lganda, Activity onResume-ni yo'qotadi (onPause chaqiriladi), lekin ko'rinadigan bo'lib qoladi — onStart/onStop chaqirilmaydi.
Farqlar jadvali har bir metod qaysi stsenariylarda chaqirilishini aniq ko'rsatadi:
| Stsenariy | onStart | onResume |
|---|---|---|
| Ilovani ishga tushirish | Chaqiriladi | Chaqiriladi |
| Activity ustida Dialog ochilgan | Chaqirilmaydi | onPause (fokus yo'qotilishi) |
| «Uy» tugmasini bosish | onStop (yashirin) | onPause → onStop |
| «Yaqinda» dan qaytish | onStart (ko'rinadigan) | onResume (fokus) |
| Ekran aylantirish | onCreate → onStart | → onResume |
| Kiruvchi qo'ng'iroq | onStop (yashirin) | onPause → onStop |
Ushbu jadval dasturchiga aniq kodni qaysi metodga joylashtirishni hal qilishda yordam beradi. Masalan, ilova ekranning har qanday yopilishida (hatto dialog bilan ham) video o'ynatishni to'xtatishi kerak bo'lsa, kod onPause ga joylashtiriladi. Video faqat ekran to'liq yashiringanda to'xtashi kerak bo'lsa — kod onStop ga joylashtiriladi.
onStart — faqat Activity ekranda ko'rinadigan bo'lgan vaqtda ishlashi kerak bo'lgan tinglovchilarni ro'yxatdan o'tkazish uchun optimal joy. Bu uchta asosiy tizim komponenti turiga tegishli: tizim hodisalari uchun BroadcastReceiver, geolokatsiya uchun LocationListener va qurilma sensorlari uchun SensorListener.
BroadcastReceiver onStart-da Context.registerReceiver() orqali dinamik ro'yxatdan o'tkaziladi va onStop-da unregisterReceiver() orqali chiqariladi. Dinamik ro'yxatdan o'tkazish statikdan (manifestda) afzal, chunki u qabul qilgichning hayotini Activity-ning ko'rinish davri bilan cheklaydi — Activity yashirin bo'lganda ilova tizim broadcast xabarlaridan uyg'onmaydi.
private val batteryReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent) {
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
binding?.batteryText?.text = "$level%"
}
}
override fun onStart() {
super.onStart()
registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}
override fun onStop() {
unregisterReceiver(batteryReceiver)
super.onStop()
}
Geolokatsiya va sensorlar — resurs talab qiluvchi operatsiyalar. GPS yangilanishlarini onStart-da so'rash va onStop-da bekor qilish, ekran yashirin bo'lganda ilova batareyani sarflamasligini kafolatlaydi. Aniq sozlash uchun minimal interval va masofa bilan requestLocationUpdates ishlatiladi — masalan, 10 soniya va 10 metr, aniqlik va energiya sarfi o'rtasida optimal muvozanatni beradi.
Animatsiyalarni onStart-da, onCreate-da emas, boshlash animatsiyaning ekran har paydo bo'lganda ishga tushishini kafolatlaydi. Agar animatsiyani onCreate-da boshlasangiz, u faqat Activity birinchi yaratilganda ishlaydi, lekin fon rejimidan qaytganda emas. onStart Activity har ko'rinadigan bo'lganda chaqiriladi, bu uni tsiklik animatsiyalar va o'tishlarni boshlash uchun ideal joyga aylantiradi.
private lateinit var pulseAnimator: ValueAnimator
override fun onStart() {
super.onStart()
pulseAnimator.start()
binding?.loadingIndicator?.animate()?.alpha(1f)?.start()
}
override fun onStop() {
pulseAnimator.cancel()
binding?.loadingIndicator?.animate()?.cancel()
super.onStop()
}
ObjectAnimator yoki ValueAnimator ishlatadigan animatsiyalar uchun onStop-da cancel() chaqirish muhimdir. Animatsiya Activity yashiringandan keyin ishlashni davom ettirsa, GPU va CPU resurslarini behuda sarflaydi, qurilma unumdorligini pasaytiradi va batareyaning tez zaryadsizlanishiga olib keladi. Android Studio Profiler (GPU grafigi) faol animatsiyalarni kuzatish va oqishlarni aniqlash imkonini beradi.
onStart/onStop juftlik qoidasi oldindan ko'rish uchun kamera (CameraX) bilan ishlashga ham tegishli. Kamerani onStart-da ochish va onStop-da yopish, ilovangiz ekranda ko'rinmasa, kameraning boshqa ilovalar uchun bloklanmaganligini kafolatlaydi. Ushbu qoidani buzish Google Play-da salbiy sharhlarning tez-tez uchraydigan sabablaridan biridir.
Tez-tez beriladigan savollar
onStart — ekran ko'rinadigan bo'lgan vaqtda ishlashi kerak bo'lgan tinglovchilar uchun (BroadcastReceiver, LocationListener, SensorListener). onResume — monopol kirishni talab qiladigan resurslar uchun (kamera, video yozish, nutqni aniqlash). Tizim hodisa tinglovchilari monopol kirishni talab qilmaydi va qisman yopilganda ham ishlashi mumkin — ular onStart-da ro'yxatdan o'tkaziladi. Kamera faqat to'liq fokusda faol bo'lishi kerak — onResume-da ochiladi.
onStart har doim chaqiriladi, agar Activity ko'rinadigan holatga o'tsa. onStart bo'lmagan yagona stsenariy — Activity yaratiladi va darhol tugatiladi (masalan, onCreate-dagi xato tufayli). Bu holda onCreate-dan keyin darhol onDestroy chaqiriladi. Ammo bu to'g'ri yozilgan kodda bo'lmasligi kerak bo'lgan avariya stsenariysidir.
Ha, onStart onResume-ni olmasligi mumkin, agar Activity ustida darhol boshqa Activity yoki shaffof oyna ochilsa. Masalan, onCreate-dan keyin avtorizatsiya ekrani ishga tushirilsa (Activity A → Activity B), Activity A da onStart chaqiriladi, lekin onResume yo'q — u B ekrani bilan yopilganda darhol onPause → onStop oladi.
onStart Activity namunasi hayoti davomida bir necha marta chaqirilishi mumkin. Activity har safar yashirin holatdan (onStop) ko'rinadigan holatga o'tganda onStart chaqiriladi. Amalda, ilovadan faol foydalanishda onStart sessiya davomida o'nlab yoki yuzlab marta chaqirilishi mumkin.
Ma'lumotlarni onStart-da yuklash ma'lumotlar ekran har paydo bo'lganda yangilanishi kerak bo'lsa, asoslidir. Masalan, yangiliklar lentasi yoki bildirishnomalar ro'yxati. Lekin yuklash asinxron bo'lishi kerak — lifecycleScope bilan korutinlar orqali, UI thread-ni bloklamaslik uchun. Ekran ko'rinishlari o'rtasida o'zgarmaydigan ma'lumotlar uchun ularni bir marta onCreate-da yuklash kifoya.
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.