Activity Yaşam Döngüsünü ve ActivityThread'in Rolünü Anlamak
Activity — uygulamanın ekranıdır; ActivityThread ise mesaj kuyruğu (Handler H) ve Looper aracılığıyla geri çağırım yöntemlerinin oluşturulmasını ve çağrılmasını yönetir. Kısaca: ana iş parçacığını bloklamayın, kaynakları serbest bırakın ve yaşam döngüsünden haberdar bileşenler kullanın — böylece ANR'lar ve bellek sızıntıları nadir görülür.
ActivityThread Nedir ve H (Handler) Nasıl Çalışır?
ActivityThread, uygulama sürecindeki sistem sınıfıdır (android.app), Looper/MessageQueue oluşturur ve Activity yaşam döngüsüyle ilgili olayları işler. Sistem, kuyruğa mesajlar (LAUNCH_ACTIVITY, PAUSE_ACTIVITY vb.) gönderir; H bu mesajları ayrıştırır ve Instrumentation'ı çağırarak onCreate/onStart/onResume gibi yöntemlerinizi tetikler. İki önemli nokta:
- Tüm Activity geri çağırmaları, Looper tarafından yönetilen ana (UI) iş parçacığında çalıştırılır.
- Mesaj işleyicide veya Activity içinde uzun süreli senkron kod çalıştırılırsa kuyruk bloklanır — ANR oluşabilir.
- ActivityThread, Activity kayıtlarını (ActivityClientRecord) saklar ve bunlar üzerinden performLaunchActivity'yi başlatarak yaşam döngüsünü çağırır.
Basitleştirilmiş örnek:
public final void handleLaunchActivity(ActivityClientRecord r) {
performLaunchActivity(r, null); // içinde onCreate, setContentView vb. çağrılır
}
Handler üzerinden bellek sızıntılarını önlemek için onDestroy()/onStop() içinde ertelenmiş mesajları ve H geri çağırmalarını temizleyin.
Activity Yaşam Döngüsü: Her Yöntemde Ne Yapılmalı?
Kısaca: onCreate → onStart → onResume (etkin); arka plana geçişte: onPause → onStop; tamamen sonlandırıldığında: onDestroy; geri dönüşte: onRestart → onStart → onResume.
Kod yerleştirme önerileri:
- onCreate(): UI'ı şişirme (setContentView), ViewModel başlatma, statik başlatma, kısa ömürlü BroadcastReceiver kaydı.
- onStart(): Abonelikleri bağlama, gözlemlemeyi başlatma (LiveData), bağlantıları açma ancak ağır görevlerden kaçınma.
- onResume(): Animasyonları başlatma, kullanıcı etkileşimli işlemler; hızlı kontroller.
- onPause(): Girilen verileri kaydetme, animasyonları duraklatma, aktif UI işlemlerini iptal etme.
- onStop(): Büyük kaynakları serbest bırakma (kamera, GPS), geri yükleme için durumu kaydetme.
- onDestroy(): Nihai temizlik, dosyaları kapatma, geri çağırmaları kaldırma.
- onSaveInstanceState(Bundle): Geçici UI durumunu kaydetme (kaydırma konumu, giriş alanları).
Uzun süren işlemleri onCreate/onResume içinde tutmayın — arka plan görevleri için korutinler, Executors, WorkManager veya Foreground Service kullanın.
UI iş parçacığını bloklamayın: geri çağırmalarda uzun süren işlemler ANR'a ve uygulamanın donmasına yol açar.
Hata Ayıklama ve Optimizasyon İçin Pratik İpuçları
- Yaşam döngüsünü günlüğe kaydedin: Log.d(TAG, "onCreate"); bu, iş akışının nerede durduğunu hızla gösterir.
- Abonelikleri ve geri çağırmaları temizleyin: handler.removeCallbacksAndMessages(null), unregisterReceiver().
- Activity yeniden oluşturulduğunda (örneğin ekran döndürüldüğünde) durumu saklamak için ViewModel kullanın.
- Uzun süren arka plan görevleri için WorkManager/Service kullanın, Activity'yi bellekte tutmayın.
- UI iş parçacığında I/O ve blokajları tespit etmek için hata ayıklama derlemelerinde StrictMode'u etkinleştirin.
- Senaryoları test edin: ekran döndürme, gelen aramalar, uygulamalar arasında geçiş, düşük bellek.
Sık Yapılan Hatalar
- Context/Activity'ye statik referanslar → bellek sızıntıları.
- Uzun ömürlü iç içe non-static inner sınıflar (Handler, Runnable) temizlenmez.
- onCreate/onResume içinde senkron ağ I/O'su.
- onSaveInstanceState işlenmez → Activity yeniden oluşturulduğunda veri kaybı.
- Kaynakların yalnızca onDestroy'da kapatılması (onStop yerine) — kaynaklar daha uzun süre tüketilebilir.
SSS
-
Ağır başlatmayı ne zaman yapmalı — onCreate'te mi yoksa arka plan iş parçacığında mı?
- UI başlatmasını onCreate'te, ağır hesaplamaları/istekleri arka plana taşıyın (korutinler/Executor/WorkManager).
-
Uzun süren bir görevi Activity yerine Service'te çalıştırmak mümkün mü?
- Evet. Uzun süren görevler için Foreground Service veya WorkManager kullanın; Activity arka plan çalışması için tasarlanmamıştır.
-
Handler üzerinden bellek sızıntılarını nasıl önlerim?
- Handler'ı static yapın veya Activity'ye WeakReference kullanın ve onStop/onDestroy'da ertelenmiş mesajları mutlaka temizleyin.
Activity ve ActivityThread etkileşimini kavradığınızda, kaynakları öngörülebilir şekilde yönetebilir, ANR'lardan kaçınabilir ve dayanıklı uygulamalar oluşturabilirsiniz.