onStart — Android həyat dövrünün metodu olub, Activity və ya Fragment istifadəçi üçün görünən olduqda çağırılır. Bu anda ekran cihazın displeyində görünür, lakin hələ istifadəçi ilə qarşılıqlı əlaqədə ola bilməz — daxiletmə fokusu onResume çağırılana qədər yoxdur. onStart metodu sistem dinləyicilərinin qeydiyyatı, geolokasiya xidmətlərinə qoşulma və komponent ekranda görünən olduğu müddətdə işləməli olan animasiyaların başladılması üçün idealdır. Activity-nin tam həyat dövrü haqqında daha ətraflı Activity Lifecycle məqaləsində oxuyun.
Əsas məqamlar
onStart — Activity həyat dövrünün ikinci metodu olub, sistem tərəfindən onCreate-dən sonra (və ya dayandırılmış vəziyyətdən qayıtdıqda onRestart-dan sonra) çağırılır. onStart çağırıldığı anda Activity və ya Fragment ekranda görünən olur. İstifadəçi interfeysi görür, lakin ekran hələ qarşılıqlı əlaqəyə hazır deyil — daxiletmə fokusu yalnız onResume-dən sonra yaranacaq.
onStart metodu Activity-nin «görünən ömrü»nə (visible lifetime) daxildir — onStart və onStop arasındakı interval. Bu müddət ərzində Activity digər pəncərələr (məsələn, şəffaf Activity və ya dialoq qutusu) tərəfindən qismən örtülə bilər, lakin onun UI-i görünən qalır. Bu, görünən ömrü Activity-nin tam fokusa malik olduğu «ön planda olma ömrü»ndən (onResume — onPause) fərqləndirir.
Bu üçsəviyyəli iyerarxiyanı anlamaq kodun düzgün bölüşdürülməsi üçün kritik əhəmiyyətlidir. onCreate — birdəfəlik inisiallaşdırma, onStart — görünən resursların qoşulması, onResume — eksklüziv resurslara monopoldan istifadə. Bu səviyyələri qarışdıran tərtibatçı yaddaş sızmaları və ya ekranlar arasında keçid zamanı səhv davranış riski yaradır.
Activity-də onStart metodu ekran displeydə hər görünəndə çağırılır — həm ilk işə salınmada (onCreate-dən sonra), həm də fon rejimindən qayıtdıqda (onRestart-dan sonra). onCreate-dən fərqli olaraq, onStart Activity nümunəsinin ömrü ərzində dəfələrlə çağırıla bilər, buna görə də ekran hər görünəndə icra edilməli olan kod bura yerləşdirilir.
class DashboardActivity : AppCompatActivity() {
private val connectivityReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isConnected = ... // ConnectivityManager yoxlanışı
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()
}
}
Əsas qayda: onStart-də qoşulmuş bütün resurslar onStop-da sərbəst buraxılmalıdır. Bu, Activity ekrandan gizləndikdə onun batareya sərf etməməsini, sistem hadisələrini dinləməməsini və yaddaş tutmamasını təmin edir. Android Studio-da BroadcastReceiver qeydiyyatı zamanı müvafiq silinmə olmadan xəbərdarlıq edən lint qaydaları mövcuddur.
Fragment-də onStart konteyner Activity-nin həyat dövrü ilə sıx bağlıdır. Fragment onStart çağırışını yalnız onu ehtiva edən Activity onStart aldıqdan sonra alır. Lakin Fragment gecikmiş rejimdə əlavə edilibsə (FragmentTransaction.commit() addToBackStack olmadan), onStart gecikmə ilə çağırıla bilər.
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-ın spesifikası: əgər Fragment offscreenPageLimit = 1 olan ViewPager-də yerləşirsə, qonşu fragmentlər də görünən olmamışdan əvvəl onStart alacaq. Bu, dinləyicilərin vaxtından əvvəl qeydiyyatına səbəb ola bilər. Belə hallarda setUserVisibleHint() metodundan və ya onStart daxilində isVisible yoxlanışından istifadə edərək dinləyiciləri yalnız həqiqətən görünən fragmentlər üçün qeydiyyatdan keçirin.
onStart və onResume arasındakı əsas fərq — ekran aktivlik səviyyəsidir. onStart Activity-nin ekranda görünən olduğunu, lakin mütləq ön planda olmadığını bildirir. onResume Activity-nin ön planda olduğunu və daxiletmə fokusuna malik olduğunu bildirir. Fərq dialoq qutusu nümunəsində aydın görünür: Activity üzərində Dialog görünəndə Activity onResume-ni itirir (onPause çağırılır), lakin görünən qalır — onStart/onStop çağırılmır.
Fərqlər cədvəli hər metodun hansı ssenarilərdə çağırıldığını aydın göstərir:
| Ssenari | onStart | onResume |
|---|---|---|
| Tətbiqin işə salınması | Çağırılır | Çağırılır |
| Activity üzərində Dialog açılıb | Çağırılmır | onPause (fokus itkisi) |
| «Ev» düyməsinin basılması | onStop (gizli) | onPause → onStop |
| «Son istifadə olunanlar»dan qayıtma | onStart (görünən) | onResume (fokus) |
| Ekranın döndərilməsi | onCreate → onStart | → onResume |
| Daxil olan zəng | onStop (gizli) | onPause → onStop |
Bu cədvəl tərtibatçıya konkret kodu hansı metoda yerləşdirəcəyinə qərar verməyə kömək edir. Məsələn, tətbiq ekranın hər örtülməsində (hətta dialoqla da) video oynatmanı dayandırmalıdırsa, kod onPause-da yerləşdirilir. Video yalnız ekran tam gizləndikdə dayanmalıdırsa — kod onStop-da yerləşdirilir.
onStart — yalnız Activity ekranda görünən olduqda işləməli olan dinləyicilərin qeydiyyatı üçün optimal yerdir. Bu, üç əsas sistem komponenti növünə aiddir: sistem hadisələri üçün BroadcastReceiver, geolokasiya üçün LocationListener və cihaz sensorları üçün SensorListener.
BroadcastReceiver onStart-də Context.registerReceiver() vasitəsilə dinamik qeydiyyatdan keçir və onStop-da unregisterReceiver() vasitəsilə silinir. Dinamik qeydiyyat statikdən (manifestdə) üstündür, çünki qəbuledicinin ömrünü Activity-nin görünmə dövrü ilə məhdudlaşdırır — Activity gizli olduqda tətbiq sistem broadcast mesajlarından oyanmır.
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()
}
Geolokasiya və sensorlar — resurs tutumlu əməliyyatlardır. GPS yeniləmələrinin onStart-də tələb edilməsi və onStop-da ləğv edilməsi, ekran gizli olduqda tətbiqin batareya sərf etməməsini təmin edir. Dəqiq tənzimləmə üçün minimum interval və məsafə ilə requestLocationUpdates istifadə olunur — məsələn, 10 saniyə və 10 metr, dəqiqlik və enerji sərfiyyatı arasında optimal balans verir.
Animasiyaların onStart-də, onCreate-də yox, başladılması animasiyanın ekran hər görünəndə işə düşməsini təmin edir. Əgər animasiyanı onCreate-də başlatsanız, o yalnız Activity-nin ilk yaradılmasında işə düşəcək, lakin fon rejimindən qayıtdıqda yox. onStart Activity hər görünən olduqda çağırılır ki, bu da onu dövri animasiyalar və keçidlər üçün ideal yer edir.
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 və ya ValueAnimator istifadə edən animasiyalar üçün onStop-da cancel() çağırmaq vacibdir. Animasiya Activity gizləndikdən sonra işləməyə davam edərsə, GPU və CPU resurslarını boş yerə sərf edir, cihazın performansını aşağı salır və batareyanın sürətlə boşalmasına səbəb olur. Android Studio Profiler (GPU qrafası) aktiv animasiyaları izləməyə və sızmaları aşkar etməyə imkan verir.
onStart/onStop cütü qaydası ön görüntü üçün kamera (CameraX) ilə işə də də aiddir. Kameranın onStart-də açılması və onStop-da bağlanması, tətbiqiniz ekranda görünməyəndə kameranın digər tətbiqlər üçün bloklanmamasını təmin edir. Bu qaydanın pozulması Google Play-də mənfi rəylərin tez-tez rast gəlinən səbəblərindəndir.
Tez-tez verilən suallar
onStart — ekran görünən olduqda işləməli olan dinləyicilər üçün (BroadcastReceiver, LocationListener, SensorListener). onResume — monopoliya girişi tələb edən resurslar üçün (kamera, video çəkiliş, nitqin tanınması). Sistem hadisə dinləyiciləri monopoliya girişi tələb etmir və qismən örtülmə zamanı işləyə bilər — onlar onStart-də qeydiyyatdan keçirilir. Kamera yalnız tam fokusda aktiv olmalıdır — onResume-də açılır.
Activity görünən vəziyyətə keçərsə, onStart həmişə çağırılır. onStart olmadan yeganə ssenari — Activity yaradılır və dərhal başa çatır (məsələn, onCreate-də səhv səbəbindən). Bu halda onCreate-dən sonra dərhal onDestroy çağırılır. Lakin bu, düzgün yazılmış koddə olmamalı olan qəza ssenarisidir.
Bəli, onStart onResume almaya bilər, əgər Activity üzərində dərhal başqa Activity və ya şəffaf pəncərə açılırsa. Məsələn, onCreate-dən sonra avtorizasiya ekranı işə salınarsa (Activity A → Activity B), Activity A-da onStart çağırılır, lakin onResume yox — o, B ekranı ilə örtülərkən dərhal onPause → onStop alır.
onStart Activity nümunəsinin ömrü ərzində dəfələrlə çağırıla bilər. Activity hər dəfə gizli vəziyyətdən (onStop) görünən vəziyyətə keçəndə onStart çağırılır. Praktikada tətbiqin aktiv istifadəsi zamanı onStart sessiya ərzində onlarla və ya yüzlərlə dəfə çağırıla bilər.
Məlumatların onStart-da yüklənməsi məlumatlar ekran hər görünəndə yenilənməlidirsə, əsaslandırılmışdır. Məsələn, xəbər lentinin və ya bildiriş siyahısının yenilənməsi. Lakin yükləmə asinxron olmalıdır — UI thread-ni bloklamamaq üçün lifecycleScope ilə korutinlər vasitəsilə. Ekran görünmələri arasında dəyişməyən məlumatlar üçün onları bir dəfə onCreate-də yükləmək kifayətdir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun