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 — 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.
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.
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.
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.
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.
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.
| İşlem | Yöntem | Gerekçe |
|---|---|---|
| Coğrafi konum aboneliği | onStart / onStop | GPS kısmi görünürlükte çalışabilir |
| Kamerayı açma | onResume / onPause | Kamera özel bir kaynaktır |
| BroadcastReceiver | onStart / onStop | Sistem olayları odak gerektirmez |
| Video oynatma | onResume / onPause | Video kullanıcıya görünür olmalıdır |
| Bluetooth tarama | onStart / onStop | Tarama arka planda çalışabilir |
| Ses kaydedici (MediaRecorder) | onResume / onPause | Kayıt aktif UI gerektirir |
| Sensör dinleyicileri | onResume / onPause | Oyunlar ve hareketler için sensörler |
| Veri güncelleme | onStart | Gö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, 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 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.
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()
}
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.
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.
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.
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.
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'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
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, 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.
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.
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 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
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.
Ayrıca okuyun