onResume — Android həyat dövrü metodudur, Activity və ya Fragment ön plana çıxdıqda və giriş fokusu aldıqda çağırılır. Bu vəziyyətdə ekran istifadəçi ilə qarşılıqlı əlaqəyə hazırdır: bütün toxunma hadisələri, düymə basılmaları və jestlər bu komponentə yönləndirilir. onResume Activity-nin iş vəziyyətidir, tətbiq vaxtının çox hissəsini burada keçirir. Məhz burada kameranı açır, video oxutmanı başladır, nitq tanınmasına başlayır və müstəsna giriş tələb edən sensor dinləyicilərini qeydiyyatdan keçirirlər. Activity-nin tam həyat dövrü haqqında daha ətraflı Activity Lifecycle məqaləsində oxuyun.
Əsas məqamlar
onResume — Activity həyat dövrünün üçüncü metodudur, onStart-dan sonra çağırılır və ekranın istifadəçi ilə tam qarşılıqlı əlaqəyə hazır olduğunu bildirir. Bu anda Activity tapşırıqlar yığınının (back stack) zirvəsindədir, sistem ona bütün giriş hadisələrini yönləndirir və tətbiq istifadəçinin aktiv iştirakını tələb edən istənilən əməliyyata başlaya bilər: video zənglər, oyunlar, səs yazısı, Canvas üzərində çəkmə.
onResume ön planda həyat (foreground lifetime) dövrünə daxildir — onResume və onPause arasındakı müddət. Bu, Activity-nin ən aktiv iş dövrüdür, tətbiq maksimum resurs sərf edir: toxunmaları emal etmək üçün prosessor, animasiyaları göstərmək üçün GPU, video çəkiliş üçün kamera və mikrofon. Həyat dövrünün bu səviyyəsini başa düşmək enerji sərfiyyatının optimallaşdırılması üçün vacibdir — onResume-də açılan resurslar onPause-də dərhal bağlanmalıdır.
Google I/O 2025 məlumatlarına görə, bir sessiya ərzində Activity-nin onResume vəziyyətində keçirdiyi orta vaxt xəbər tətbiqləri üçün 2–5 dəqiqə, oyunlar və mesajlaşma tətbiqləri üçün 15–30 dəqiqə təşkil edir. Qalan vaxt Activity onPause, onStop və ya onDestroy vəziyyətlərində olur. Bu o deməkdir ki, məhz onResume kodunun optimallaşdırılması performans və batareya iş müddətində ən böyük qazancı verir.
Activity-də onResume metodu ekran hər dəfə giriş fokusu aldıqda çağırılır — ilk işə salındıqda, başqa Activity-dən qayıtdıqda, dialoq pəncərəsi bağlandıqda, cihazın kilidi açıldıqda. Bu isti metoddur, sessiya ərzində dəfələrlə çağırıla bilər və onun tətbiqi mümkün qədər yüngül olmalıdır.
class CameraActivity : AppCompatActivity() {
private var cameraProvider: ProcessCameraProvider? = null
private var preview: Preview? = null
override fun onResume() {
super.onResume()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
preview = Preview.Builder().build().also {
it.setSurfaceProvider(binding?.viewFinder?.surfaceProvider)
}
try {
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(
this, cameraSelector, preview
)
} catch (e: Exception) {
Log.e("Camera", "Kameranı bağlamaq mümkün olmadı", e)
}
}, ContextCompact.getMainExecutor(this))
}
override fun onPause() {
super.onPause()
cameraProvider?.unbindAll()
preview = null
}
}
CameraX nümunəsi onResume/onPause klassik istifadəsini göstərir: kamera müstəsna resursdur, müəyyən bir anda yalnız bir tətbiq tərəfindən istifadə edilə bilər. Kameranın bindToLifecycle vasitəsilə həyat dövrünə bağlanması onu onPause-də avtomatik bağlayır, lakin açıq unbindAll çağırışı dərhal sərbəst buraxılmasını təmin edir. Bu, Activity-lər arasında keçid zamanı xüsusilə vacibdir: kamera başqa Activity onu açmağa cəhd etməzdən əvvəl sərbəst buraxılmalıdır.
Fragment-də onResume onu ehtiva edən Activity onResume aldıqdan sonra çağırılır. Lakin FragmentManager və ViewPager xüsusiyyətlərinə görə Fragment üçün onResume çağırış anı Activity-yə nisbətən gecikə bilər. Məsələn, offscreenPageLimit = 1 olan ViewPager-də Fragment onResume-ni yalnız cari səhifə olduqda alır, Activity başladıqda yox.
class VideoPlayerFragment : Fragment() {
private var exoPlayer: ExoPlayer? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
exoPlayer = ExoPlayer.Builder(requireContext()).build()
binding?.playerView?.player = exoPlayer
}
override fun onResume() {
super.onResume()
exoPlayer?.play()
if (userVisibleHint) {
startBiometricAuth()
}
}
override fun onPause() {
exoPlayer?.pause()
stopBiometricAuth()
super.onPause()
}
}
Fragment.onResume-də userVisibleHint yoxlanışı ViewPager üçün aktualdır: Fragment onResume ala bilər, lakin qonşu səhifə tərəfindən gizlədilə bilər (məsələn, animasiyalı keçid zamanı). Belə hallarda görünməni yoxlamadan onResume-də video və ya biometriyanı işə salmaq gözlənilməz davranışa səbəb olar. Fragment 1.5.0-dan başlayaraq ViewPager2-də fraqmentlərin həyat dövrünü dəqiq idarə etmək üçün FragmentTransaction.setMaxLifecycle() istifadə etmək tövsiyə olunur.
Tərtibatçılar tez-tez onStart və onResume-ni qarışdırır, kodu uyğun olmayan metoda yerləşdirirlər. Əsas qayda: onStart — görünmə zamanı işləyən resurslar üçün; onResume — giriş fokusu tələb edən resurslar üçün. Konkret ssenariləri və metodun düzgün seçilməsini nəzərdən keçirək.
| Əməliyyat | Metod | Əsaslandırma |
|---|---|---|
| Geolokasiyaya abunəlik | onStart / onStop | GPS qismən görünmə zamanı işləyə bilər |
| Kameranın açılması | onResume / onPause | Kamera — müstəsna resurs |
| BroadcastReceiver | onStart / onStop | Sistem hadisələri fokus tələb etmir |
| Video oxutma | onResume / onPause | Video istifadəçiyə görünməlidir |
| Bluetooth skan etmə | onStart / onStop | Skan arxa planda davam edə bilər |
| Səs yazıcı (MediaRecorder) | onResume / onPause | Yazı aktiv UI tələb edir |
| Sensor dinləyiciləri | onResume / onPause | Oyunlar və jestlər üçün sensorlar |
| Məlumatların yenilənməsi | onStart | Təzə məlumatlar görünəndə lazımdır |
Praktik qayda: əgər əməliyyat dialoq pəncərəsi görünəndə dayandırılmalıdırsa — onResume/onPause istifadə edin. Əgər əməliyyat ekran qismən bağlandıqda davam edə bilərsə — onStart/onStop istifadə edin. Məsələn, video pleyer dialoq açılanda videonu dayandırmalıdır (onPause), geolokasiya isə yenilənməyə davam edə bilər (onStart-da qalır).
Müstəsna resurslar — müəyyən bir anda yalnız bir tətbiq tərəfindən istifadə edilə bilən cihaz komponentləridir. Kamera, mikrofon, video çıxışı (MediaProjection), oxu rejimində NFC adapteri, accessory rejimində USB cihazları — bütün bu resurslar onResume-də açılmalı və onPause-də sərbəst buraxılmalıdır.
MediaRecorder audio və video yazmaq üçün istifadə olunur. İcazə sorğusu və MediaRecorder-in hazırlanması onCreate-də, yazının başlanması isə onResume-də aparılır. İstifadəçi başqa tətbiqə keçərsə, onPause yazını dayandırır, onResume isə bərpa edir. Bu, səs yazıcıları və video çəkiliş tətbiqləri üçün standart davranışdır.
private var mediaRecorder: MediaRecorder? = null
private var isRecording = false
override fun onResume() {
super.onResume()
if (isRecording) {
mediaRecorder?.resume()
}
}
override fun onPause() {
if (isRecording) {
mediaRecorder?.pause()
}
super.onPause()
}
Biometrik autentifikasiya (BiometricPrompt) yalnız Activity onResume vəziyyətində olduqda çağırılmalıdır. Əgər onu onCreate və ya onStart-da çağırsanız, biometriya dialoqu Activity inicallaşmanı tamamlamadan görünə bilər, bu da nəticənin düzgün emal edilməməsinə səbəb olar. onResume-də çağırış biometriya pəncərəsinin düzgün kontekstdə göstəriləcəyinə zəmanət verir.
Kommersiya layihələrində tətbiq olunan onResume ilə işin üç təsdiqlənmiş nümunəsini nəzərdən keçirək: hərəkətsizlik taymerinin sıfırlanması, görünən məlumatların yenilənməsi və Jetpack Navigation ilə inteqrasiya.
Məxfi məlumatları olan tətbiqlərdə (bankçılıq, tibbi kartlar) onResume avtomatik çıxış taymerini sıfırlamaq üçün istifadə olunur. İstifadəçi tətbiqlə aktiv qarşılıqlı əlaqədə olduqda, onResume ekranlar arasında hər keçiddə çağırılır və taymer sıfırlanır. İstifadəçi tətbiqi kiçildərsə, onPause taymeri dayandırır, qayıtdıqda isə onResume ya onu sıfırlayır, ya da təkrar autentifikasiya tələb edir.
Ekrana hər qayıdışda aktual məlumatları göstərməli olan siyahı onResume-də yenilənir. Məsələn, istifadəçi başqa Activity-də yeni qeyd yaratdıqda və geri qayıtdıqda, onResume siyahını yerli verilənlər bazasından və ya ViewModel keşindən yenidən yükləyir. Bu, notifyDataSetChanged-in əl ilə çağırılmadan məlumatların ardıcıllığını təmin edir.
override fun onResume() {
super.onResume()
// ActivityResultLauncher nəticə qaytardı — siyahını yeniləyirik
viewModel.refreshList()
// Hərəkətsizlik taymerinin sıfırlanması
inactivityTimer.reset()
}
Jetpack Navigation-da fraqmentin onResume-i geri naviqasiya ilə ona hər qayıdışda çağırılır. Bu xüsusiyyət UI vəziyyətini sıfırlamaq üçün istifadə olunur: klaviaturanı gizlətmək, axtarış sahələrini təmizləmək, alət çubuğunun başlığını yeniləmək. OnBackPressedCallback onResume ilə birlikdə kodu təkrarlamadan naviqasiya üzərində tam nəzarət verir.
Tez-tez verilən suallar
onStart — ekran görünür. onResume — ekran aktivdir və qarşılıqlı əlaqəyə hazırdır. Təsəvvür edin: televizora baxırsınız (onStart), amma pultu əlinizə alırsınız (onResume). Televizor həmişə görünür, lakin qarşılıqlı əlaqə yalnız pultla başlayır. Kimsə televizoru pərdə ilə örtərsə — ekran görünməz olur (onStop). Pultu sizdən alsalar — qarşılıqlı əlaqə dayanır (onPause), amma televizor hələ də görünür.
onResume Activity hər dəfə giriş fokusu aldıqda çağırılır. Minimal say — bir dəfə (işə salındıqda). Maksimal say istifadə ssenarilərindən asılıdır: ekranlar arasında keçid, dialoqların açılması, cihazın sürətli bloklanması və kilidinin açılması — hər belə ssenari ekrana qayıtdıqda onResume-ni çağırır.
Kamera yalnız bir tətbiq üçün əlçatan olan müstəsna resursdur. Kameranı onCreate və ya onStart-da açsanız, tətbiqiniz qeyri-aktiv olsa belə, digər tətbiqlər üçün bloklanmış qalacaq. onResume kameranın yalnız Activity ön planda olduqda açılmasına zəmanət verir, onPause isə dərhal onu bağlayır. Bu, CameraX və Camera2 API sənədlərində təsbit edilmiş Android inkişaf standartıdır.
Bəli, Activity göründükdən dərhal sonra başqa Activity tərəfindən örtülərsə, onResume baş verməyə bilər. Məsələn, Activity A onCreate və ya onStart metodunda Activity B-ni işə salır. Bu halda A onStart → onPause → onStop alır, onResume-ni keçir. Sistem onResume-ni çağırmır, çünki Activity A heç vaxt giriş fokusu almamışdır.
onResume-də uzun sinxron əməliyyatlar yerinə yetirmək olmaz: şəbəkədən böyük məlumat yükləmək, mürəkkəb SQL sorğuları, şəkillərin emalı. onResume metodu UI axınında işləyir və 100–200 ms-dən uzun hər hansı bloklama interfeysin cavab verməsində gecikməyə səbəb olur. Bütün ağır əməliyyatlar asinxron olmalıdır — korutinlər, RxJava və ya WorkManager vasitəsilə. Həmçinin yoxlamadan onResume-də finish() çağırmaq tövsiyə edilmir — bu, sonsuz yenidən yaratma dövrünə səbəb ola bilər.
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