onResume — əsasları, Android-də istifadəçi ilə qarşılıqlı əlaqə

Müəllif: IT Sectr Dərc olunub: 2026-03-04 Oxuma vaxtı: 10 dəq

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 ön planda giriş fokusu ilə; onStart-dan sonra və ya dialoq pəncərəsindən qayıtdıqda çağırılır
  • Müstəsna resurslar — kamera, mikrofon, video çəkiliş onResume-də açılır və onPause-də bağlanır
  • onResume/onPause cütü — tam fokus tələb edən resurslar bu cüt ilə idarə olunur; onResume-də qeydiyyatdan keçir, onPause-də sərbəst buraxılır
  • onResume vs onStart — onStart = görünmə, onResume = qarşılıqlı əlaqə; dialoq onResume-ni bağlayır, amma onStart-ı yox
  • Vaxtlama — onResume sürətli olmalıdır; uzun əməliyyatlar interfeysin cavab verməsini gecikdirir
  • Fragment.onResume — Activity.onResume-dən sonra, Fragment qarşılıqlı əlaqəyə hazır olduqda çağırılır
  • Jetpack-də onResume — lifecycleScope və LiveData abunəlikləri avtomatik idarə etmək üçün onResume-dən istifadə edir

Android-də onResume metodunun əsasları

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

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.

kotlin
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

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.

kotlin
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.

onResume vs onStart: nə vaxt nəyi istifadə etməli

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əliyyatMetodƏsaslandırma
Geolokasiyaya abunəlikonStart / onStopGPS qismən görünmə zamanı işləyə bilər
Kameranın açılmasıonResume / onPauseKamera — müstəsna resurs
BroadcastReceiveronStart / onStopSistem hadisələri fokus tələb etmir
Video oxutmaonResume / onPauseVideo istifadəçiyə görünməlidir
Bluetooth skan etməonStart / onStopSkan arxa planda davam edə bilər
Səs yazıcı (MediaRecorder)onResume / onPauseYazı aktiv UI tələb edir
Sensor dinləyicilərionResume / onPauseOyunlar və jestlər üçün sensorlar
Məlumatların yenilənməsionStartTə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ın idarə edilməsi

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 ilə iş

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.

kotlin
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()
}

BiometricPrompt və onResume

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.

Nümunələr və tövsiyələr

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.

Hərəkətsizlik taymerinin sıfırlanması

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.

Qayıtdıqda məlumatların yenilənməsi

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.

kotlin
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 və onResume

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

onResume və onStart arasında sadə sözlərlə fərq nədir?

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 nə qədər tez-tez çağırılı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.

Niyə onResume kameranı açmaq üçün ən yaxşı yerdir?

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.

onResume onStart-dan sonra çağırılmaya bilə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ə nə etmək olmaz?

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ə

  • onResume — giriş fokusu ilə ön plan vəziyyəti; Activity istifadəçi ilə qarşılıqlı əlaqəyə hazırdır
  • Müstəsna resurslar — kamera, mikrofon, video çəkiliş onResume-də açılır və onPause-də bağlanır
  • onResume vs onStart — onStart görünən, onResume aktiv resurslar üçün; dialoq onResume-ni kəsir, amma onStart-ı yox
  • Sürət — onResume yüngül olmalıdır; bütün ağır əməliyyatlar asinxron
  • Fragment.onResume — ViewPager-də görünmədən asılıdır; userVisibleHint yoxlanmalı və ya setMaxLifecycle istifadə edilməlidir
  • Tipik tapşırıqlar — taymerin sıfırlanması, qayıtdıqda məlumatların yenilənməsi, BiometricPrompt idarəsi
  • onResume/onPause cütü — müstəsna girişi olan resurslar yalnız bu cüt tərəfindən idarə olunur

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.

Layihəni müzakirə et

Həm də oxuyun