Activity Yaşam Döngüsünü ve ActivityThread'in Rolünü Anlamak

Kerem Aydın·6 Temmuz 2026·⏱3 dk

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.