Activity ve MainActivity — Kısa ve Öz
Activity, uygulamanın ayrı bir ekranıdır (UI + mantık); MainActivity ise genellikle giriş noktası olarak tanımlanır (intent-filter MAIN + LAUNCHER). Aşağıda projede Activity'den sorumlu olan bileşenler, MainActivity'nin nasıl oluşturulup kaydedileceği ve yaşam döngüsüyle nasıl doğru şekilde çalışılacağı anlatılmaktadır.
Proje Yapısı: Activity ve Düzen Dosyaları Nerede Bulunur?
app modülündeki temel konumlar:
- app/src/main/java/... — Kotlin/Java sınıfları; burada MainActivity.kt yer alır.
- app/src/main/res/layout — XML düzen dosyaları (activity_main.xml).
- app/src/main/AndroidManifest.xml — Activity kaydı ve giriş noktası.
- build.gradle (Module: app) — bağımlılıklar (Compose, Navigation vb.).
AndroidManifest.xml içinde başlangıç Activity'si için örnek kayıt:
<activity android:name=".MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Jetpack Compose kullanıyorsanız, düzen dosyası res/layout içinde olmayabilir; UI, Activity içindeki setContent { } bloğunda tanımlanır.
MainActivity Oluşturma ve Yapılandırma (Kotlin, 2026)
Compose ile temel şablon:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
Surface(modifier = Modifier.fillMaxSize()) {
Greeting("Android")
}
}
}
}
}
@Composable fun Greeting(name: String) { Text("Hello $name!") }
Compose kullanmıyorsanız:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
Activity ekleme yöntemi: package üzerinde sağ tık → New → Activity → Empty Activity — Studio, sınıfı ve gerekirse manifest kaydını otomatik oluşturur.
Durum yönetimi için Kotlin ile birlikte ViewModel ve Flow/LiveData kullanın; kod daha kısa olur ve bellek sızıntıları azalır.
Activity Yaşam Döngüsü: Ne Zaman Ne Yapılır?
Temel geri çağrı yöntemleri ve önerilen işlemler:
- onCreate(): UI, ViewModel ve aboneliklerin başlatılması.
- onStart(): Activity görünür hale gelir — animasyonları başlatın.
- onResume(): Activity ön planda — girişi, kamerayı ve zamanlayıcıları yeniden etkinleştirin.
- onPause(): Verileri kaydedin, yoğun işlemleri duraklatın.
- onStop(): Kaynakları serbest bırakın, animasyonları durdurun.
- onDestroy(): Nihai temizlik (abonelikleri iptal edin, veritabanlarını kapatın).
- onRestart(): onStop() sonrası geri dönüş.
Ağır işlemleri onResume() içinde tutmayın; ViewModel ve coroutine'ler kullanın, bunları onDestroy() içinde iptal edin.
Durumların Kısa Tablosu
| Yöntem | Görünür | Odak | Ne Yapılır |
|---|---|---|---|
| onCreate | hayır | hayır | Başlatma |
| onStart | evet | hayır | UI Hazırlığı |
| onResume | evet | evet | Etkileşim |
| onPause | evet | hayır | Durum Kaydetme |
| onStop | hayır | hayır | Kaynak Serbest Bırakma |
| onDestroy | hayır | hayır | Nihai Temizlik |
Büyük nesneleri Activity'de (Context) tutmayın; uzun ömürlü kaynaklar için ViewModel ve applicationContext kullanın.
Geçişler, Veri Aktarımı ve En İyi Uygulamalar
- Başka bir Activity başlatma:
- Intent: startActivity(Intent(this, SecondActivity::class.java))
- Sonuç almak için eski startActivityForResult yerine Activity Result API (registerForActivityResult) kullanın.
- Veri aktarımı: intent.putExtra / intent.getParcelableExtra, ancak büyük veri kümeleri için ortak ViewModel veya navigasyon host'u tercih edin.
- Navigasyon: Jetpack Navigation (XML/Fragments için) veya Navigation Compose. Mümkün olduğunca az Activity kullanmak ve ekranları fragment'ler/navigasyon üzerinden yönetmek daha iyidir; bu sayede durum koruma daha kolay olur.
- Uzun süren görevlerle çalışma: ViewModel + coroutineScope + lifecycleScope, UI güncellemeleri için LiveData/Flow.
Sık Yapılan Hatalar
- Activity context'inin singleton'larda tutulması → bellek sızıntıları.
- onResume/onCreate içinde eşzamanlı olmayan ağır işlemler → UI donmaları.
- Activity'nin manifest'te kaydedilmemesi (özellikle manuel oluşturulduğunda) → ekran açılmaz.
- Activity Result API yerine startActivityForResult kullanılması.
- NavHost olmadan karmaşık navigasyon → Activity sayısının artması ve kod tekrarı.
SSS
- Uygulamanın her "sayfası" için ayrı bir Activity mi oluşturulmalı?
- Hayır. Genellikle tek bir Activity kapsayıcı olarak kullanılır ve ekranlar için navigasyon (fragment'ler/Compose Nav) tercih edilir.
- Ekran döndürme sırasında durum nasıl korunur?
- ViewModel + SavedStateHandle veya basit veriler için onSaveInstanceState.
- Fragment mi yoksa Compose mu kullanılmalı?
- Compose, UI için modern bir araçtır. Fragment'ler, hibrit projelerde veya geçiş dönemlerinde hala geçerlidir.
Basit bir MainActivity ile başlayın, mantığı ViewModel'e taşıyın ve Navigation kullanın; böylece çoğu sorundan kaçınır ve projenizi büyümeye hazırlarsınız.