onResume — Temel bilgiler, Android'de kullanıcı etkileşimi

Yazar: IT Sectr Yayınlanma: 2026-03-04 Okuma süresi: 10 dk

onResume, bir Activity veya Fragment ön plana çıktığında ve giriş odağı aldığında çağrılan bir Android yaşam döngüsü yöntemidir. Bu durumda, ekran kullanıcı etkileşimine hazırdır: tüm dokunma olayları, tuş basışları ve hareketler bu bileşene yönlendirilir. onResume, uygulamanın zamanının çoğunu geçirdiği Activity'nin çalışma durumudur. Kamera burada açılır, video oynatma başlatılır, konuşma tanıma başlar ve özel erişim gerektiren sensör dinleyicileri kaydedilir. Tam Activity yaşam döngüsü hakkında daha fazla bilgi için Activity Lifecycle makalesini okuyun.

Önemli Noktalar

  • onResume — giriş odağı olan ön planda Activity; onStart'tan sonra veya bir diyalogdan dönüldüğünde çağrılır
  • Özel kaynaklar — kamera, mikrofon, video yakalama onResume'da açılır ve onPause'da kapatılır
  • onResume/onPause çifti — tam odak gerektiren kaynaklar bu çift tarafından yönetilir; onResume'da kaydedilir, onPause'da serbest bırakılır
  • onResume vs onStart — onStart = görünürlük, onResume = etkileşim; bir diyalog onResume'u geçersiz kılar ancak onStart'ı kılmaz
  • Zamanlama — onResume hızlı olmalıdır; buradaki uzun işlemler arayüz yanıt verebilirliğini geciktirir
  • Fragment.onResume — Activity.onResume'dan sonra, Fragment etkileşime hazır olduğunda çağrılır
  • Jetpack'te onResume — lifecycleScope ve LiveData, otomatik abonelik yönetimi için onResume'u kullanır

Android'de onResume Yönteminin Temelleri

onResume — onStart'tan sonra çağrılan ve ekranın kullanıcıyla tam etkileşime hazır olduğunu belirten Activity yaşam döngüsünün üçüncü yöntemidir. Bu anda, Activity görev yığınının (back stack) en üstündedir, sistem tüm giriş olaylarını ona yönlendirir ve uygulama, kullanıcının aktif katılımını gerektiren herhangi bir işlemi başlatabilir: görüntülü aramalar, oyunlar, ses kaydı, Canvas üzerinde çizim.

onResume, “ön plan ömrü”nün (foreground lifetime) bir parçasıdır — onResume ve onPause arasındaki aralık. Bu, Activity'nin en aktif dönemidir, uygulamanın en fazla kaynağı tükettiği zamandır: dokunma işleme için CPU, animasyon oluşturma için GPU, video yakalama için kamera ve mikrofon. Yaşam döngüsünün bu seviyesini anlamak, enerji tüketimini optimize etmek için kritiktir — onResume'da açılan kaynaklar onPause'da hemen kapatılmalıdır.

Google I/O 2025'e göre, bir Activity'nin oturum başına onResume durumunda geçirdiği ortalama süre, haber uygulamaları için 2–5 dakika ve oyunlar ile mesajlaşma uygulamaları için 15–30 dakikadır. Geri kalan tüm süre boyunca Activity, onPause, onStop veya onDestroy durumlarındadır. Bu, özellikle onResume kodunu optimize etmenin performans ve pil ömrü açısından en büyük kazanımı sağladığı anlamına gelir.

Activity'de onResume

Bir Activity'de, onResume yöntemi ekran giriş odağı aldığı her seferde çağrılır — ilk başlatmada, başka bir Activity'den dönüldüğünde, bir diyalog kapatıldığında, cihazın kilidi açıldığında. Bu, oturum başına birçok kez çağrılabilen “sıcak” bir yöntemdir ve uygulaması mümkün olduğunca hafif 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", "Failed to bind camera", e)
            }
        }, ContextCompact.getMainExecutor(this))
    }

    override fun onPause() {
        super.onPause()
        cameraProvider?.unbindAll()
        preview = null
    }
}

CameraX örneği, onResume/onPause'un klasik kullanımını gösterir: kamera, aynı anda yalnızca bir uygulama tarafından kullanılabilen özel bir kaynaktır. Kamerayı bindToLifecycle aracılığıyla yaşam döngüsüne bağlamak, onPause'da kamerayı otomatik olarak kapatır, ancak açık bir unbindAll çağrısı anında serbest bırakmayı garanti eder. Bu, Activities arasında geçiş yaparken özellikle önemlidir: kamera, başka bir Activity onu açmaya çalışmadan önce serbest bırakılmalıdır.

Fragment'te onResume

Bir Fragment'te onResume, onu içeren Activity onResume'u aldıktan sonra çağrılır. Bununla birlikte, FragmentManager ve ViewPager'ın özellikleri nedeniyle, bir Fragment için onResume çağrısının zamanlaması Activity'ye göre gecikebilir. Örneğin, offscreenPageLimit = 1 olan bir ViewPager'daki Fragment, Activity başlatıldığında değil, yalnızca geçerli sayfa olduğunda onResume alır.

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'daki userVisibleHint kontrolü ViewPager ile ilgilidir: Bir Fragment onResume alabilir ancak komşu bir sayfa tarafından gizlenmiş olabilir (örneğin, animasyonlu geçiş sırasında). Bu gibi durumlarda, görünürlüğü kontrol etmeden onResume'da video veya biyometri başlatmak beklenmeyen davranışlara yol açacaktır. Fragment 1.5.0'dan itibaren, ViewPager2'de parçaların yaşam döngüsünü hassas bir şekilde kontrol etmek için FragmentTransaction.setMaxLifecycle() kullanılması önerilir.

onResume vs onStart: Ne Zaman Ne Kullanılmalı

Geliştiriciler genellikle onStart ve onResume'u karıştırır ve kodu yanlış yönteme yerleştirir. Ana kural: onStart — görünürlük sırasında çalışan kaynaklar için; onResume — giriş odağı gerektiren kaynaklar için. Belirli senaryolara ve doğru yöntem seçimine bakalım.

İşlemYöntemGerekçe
Coğrafi konum aboneliğionStart / onStopGPS kısmi görünürlükte çalışabilir
Kamerayı açmaonResume / onPauseKamera özel bir kaynaktır
BroadcastReceiveronStart / onStopSistem olayları odak gerektirmez
Video oynatmaonResume / onPauseVideo kullanıcıya görünür olmalıdır
Bluetooth taramaonStart / onStopTarama arka planda çalışabilir
Ses kaydedici (MediaRecorder)onResume / onPauseKayıt aktif UI gerektirir
Sensör dinleyicilerionResume / onPauseOyunlar ve hareketler için sensörler
Veri güncellemeonStartGörünürde güncel veri gerekir

Pratik bir kural: bir işlem diyalog göründüğünde kesintiye uğramalıysa — onResume/onPause kullanın. Bir işlem ekran kısmen kaplandığında devam edebiliyorsa — onStart/onStop kullanın. Örneğin, bir video oynatıcı diyalog açıldığında videoyu duraklatmalıdır (onPause), coğrafi konum ise güncellemeye devam edebilir (onStart'ta kalır).

Özel Kaynakların Yönetimi

Özel kaynaklar, belirli bir anda yalnızca bir uygulama tarafından kullanılabilen cihaz bileşenleridir. Kamera, mikrofon, video çıkışı (MediaProjection), okuma modunda NFC adaptörü, aksesuar modunda USB cihazları — tüm bu kaynaklar onResume'da açılmalı ve onPause'da serbest bırakılmalıdır.

MediaRecorder ile Çalışma

MediaRecorder ses ve video kaydetmek için kullanılır. İzin talepleri ve MediaRecorder hazırlığı onCreate'te yapılırken, kayıt onResume'da başlar. Kullanıcı başka bir uygulamaya geçerse, onPause kaydı duraklatır ve onResume devam ettirir. Bu, ses kaydediciler ve video kayıt uygulamaları için standart davranıştı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 ve onResume

Biyometrik kimlik doğrulama (BiometricPrompt) yalnızca Activity onResume'dayken çağrılmalıdır. onCreate veya onStart'ta çağrılırsa, biyometri diyaloğu Activity başlatmayı tamamlamadan önce görünebilir ve bu da sonucun yanlış işlenmesine yol açar. onResume'da çağırmak, biyometri penceresinin doğru bağlamda gösterilmesini sağlar.

Desenler ve Öneriler

Ticari projelerde kullanılan onResume ile çalışmak için üç kanıtlanmış desene bakalım: hareketsizlik zamanlayıcısını sıfırlama, görünür verileri güncelleme ve Jetpack Navigation ile entegrasyon.

Hareketsizlik Zamanlayıcısını Sıfırlama

Hassas verilere sahip uygulamalarda (bankacılık, tıbbi kayıtlar), onResume otomatik çıkış zamanlayıcısını sıfırlamak için kullanılır. Kullanıcı uygulamayla aktif olarak etkileşime giriyorsa, her ekran geçişinde onResume çağrılır ve zamanlayıcı sıfırlanır. Kullanıcı uygulamayı simge durumuna küçültürse, onPause zamanlayıcıyı durdurur ve geri dönüşte onResume ya onu sıfırlar ya da yeniden kimlik doğrulama ister.

Dönüşte Veri Güncelleme

Ekrana her dönüşte güncel verileri görüntülemesi gereken bir liste, onResume'da güncellenir. Örneğin, kullanıcı başka bir Activity'de yeni bir giriş oluşturduysa ve geri döndüyse, onResume listeyi yerel veritabanından veya ViewModel önbelleğinden yeniden yükler. Bu, manuel notifyDataSetChanged çağrıları olmadan veri tutarlılığını sağlar.

kotlin
override fun onResume() {
    super.onResume()
    // ActivityResultLauncher bir sonuç döndürdü — liste güncelleniyor
    viewModel.refreshList()
    // Hareketsizlik zamanlayıcısını sıfırlama
    inactivityTimer.reset()
}

Jetpack Navigation ve onResume

Jetpack Navigation'da, bir parçanın onResume'u, geri navigasyon yoluyla ona her dönüşte çağrılır. Bu özellik, kullanıcı arayüzü durumunu sıfırlamak için kullanılır: klavyeyi gizleme, arama alanlarını temizleme, araç çubuğu başlığını güncelleme. OnBackPressedCallback'in onResume ile birleşimi, kod tekrarı olmadan navigasyon üzerinde tam kontrol sağlar.

Sıkça Sorulan Sorular

Basit kelimelerle onResume ve onStart arasındaki fark nedir?

onStart — ekran görünür. onResume — ekran aktif ve etkileşime hazır. Hayal edin: televizyon izliyorsunuz (onStart), ancak kumandayı elinize alıyorsunuz (onResume). Televizyon her zaman görünür, ancak etkileşim yalnızca kumandayla başlar. Birisi televizyonu bir perdeyle kapatırsa — ekran görünmez olur (onStop). Birisi kumandayı elinizden alırsa — etkileşim durur (onPause), ancak televizyon hâlâ görünür.

onResume ne sıklıkla çağrılır?

onResume, Activity giriş odağını aldığı her seferde çağrılır. Minimum bir kezdir (başlatmada). Maksimum, kullanım senaryolarına bağlıdır: ekranlar arasında geçiş yapma, diyaloglar açma, cihazı hızlı kilitleme ve kilit açma — bu tür her senaryo, ekrana dönüşte onResume'u çağırır.

Kamerayı açmak için neden onResume en iyi yerdir?

Kamera, aynı anda yalnızca bir uygulamanın kullanabileceği özel bir kaynaktır. Kamerayı onCreate veya onStart'ta açarsanız, uygulamanız etkin olmasa bile diğer uygulamalar için kilitli kalır. onResume, kameranın yalnızca Activity ön plandayken açık olmasını garanti eder ve onPause onu hemen kapatır. Bu, CameraX ve Camera2 API belgelerinde belirtilen bir Android geliştirme standardıdır.

onStart'tan sonra onResume çağrılmayabilir mi?

Evet, bir Activity göründükten hemen sonra başka bir Activity tarafından kaplanırsa onResume gerçekleşmeyebilir. Örneğin, Activity A, onCreate veya onStart yönteminde Activity B'yi başlatır. Bu durumda, A, onResume'u atlayarak onStart → onPause → onStop alır. Sistem onResume'u çağırmaz çünkü Activity A hiçbir zaman giriş odağı almamıştır.

onResume'da ne yapılmamalıdır?

onResume'da uzun senkron işlemler yapılmamalıdır: ağdan büyük veri yükleme, karmaşık SQL sorguları, görüntü işleme. onResume, UI iş parçacığında çalışır ve 100–200 ms'den uzun herhangi bir engelleme, arayüz yanıt verebilirliğinde gecikmeye neden olur. Tüm ağır işlemler eşzamansız olmalıdır — coroutines, RxJava veya WorkManager aracılığıyla. Ayrıca, kontrol etmeden onResume'da finish() çağırmak önerilmez — bu, sonsuz bir yeniden oluşturma döngüsüne yol açabilir.

Özet

  • onResume — giriş odağı olan ön plan durumu; Activity kullanıcı etkileşimine hazır
  • Özel kaynaklar — kamera, mikrofon, video yakalama onResume'da açılır ve onPause'da kapatılır
  • onResume vs onStart — onStart görünür kaynaklar için, onResume aktif kaynaklar için; bir diyalog onResume'u kesintiye uğratır ancak onStart'ı uğratmaz
  • Performans — onResume hafif olmalıdır; tüm ağır işlemler eşzamansız
  • Fragment.onResume — ViewPager'da görünürlüğe bağlıdır; userVisibleHint kontrol edin veya setMaxLifecycle kullanın
  • Tipik görevler — zamanlayıcı sıfırlama, dönüşte veri güncelleme, BiometricPrompt yönetimi
  • onResume/onPause çifti — özel erişime sahip kaynaklar yalnızca bu çift tarafından yönetilir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun