Intent'ler Nasıl Çalışır ve Activity'ler Arasında Veri Nasıl Aktarılır
Intent, Android'de bir eylemi gerçekleştirmek niyetini açıklayan bir nesnedir: bir Activity, Service veya BroadcastReceiver başlatmak ve/veya bunlar arasında extras aracılığıyla veri aktarmak. Aşağıda, Java ve Kotlin ile veri gönderme, alma ve geri döndürme üzerine kompakt ve pratik bir rehber bulacaksınız.
İçindekiler {{TOC_AUTOMATIC}}
Intent Nedir ve Hangi Türleri Vardır?
Intent; action (eylem), data (URI), extras (Bundle) ve flag'ler (bayraklar) içerir. İki temel türü vardır:
- Açık (Explicit) — Belirli bir sınıfı belirtirsiniz: uygulamanız içindeki geçişler için kullanılır.
- Kapalı (Implicit) — Bir eylemi tanımlarsınız (örneğin, ACTION_VIEW) ve sistem uygun bileşeni seçer.
Uygulama içi geçişler için her zaman açık Intent'leri tercih edin; daha güvenilir ve hızlıdırlar.
Basit Verileri Aktarma (String, int, boolean)
Veriler, putExtra yöntemleri kullanılarak extras içine yerleştirilir ve getStringExtra, getIntExtra vb. yöntemlerle çıkarılır.
Java Örneği (MainActivity -> SecondActivity):
// MainActivity
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("user_name", "İvan");
intent.putExtra("user_age", 25);
startActivity(intent);
// SecondActivity - onCreate içinde
Intent intent = getIntent();
String name = intent.getStringExtra("user_name");
int age = intent.getIntExtra("user_age", 0);
Kotlin eşdeğeri:
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("user_name", "İvan")
putExtra("user_age", 25)
}
startActivity(intent)
// SecondActivity içinde
val name = intent.getStringExtra("user_name")
val age = intent.getIntExtra("user_age", 0)
Sonuç Döndürme: Activity Result API (Modern Yöntem)
startActivityForResult kullanımdan kaldırıldı. Bunun yerine Activity Result API kullanın:
Kotlin örneği:
// Kayıt
private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data
val message = data?.getStringExtra("result_message")
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
// Başlatma
val intent = Intent(this, SecondActivity::class.java)
launcher.launch(intent)
SecondActivity içinde:
val resultIntent = Intent().apply {
putExtra("result_message", "Veriler kaydedildi!")
}
setResult(Activity.RESULT_OK, resultIntent)
finish()
Yeni projelerde startActivityForResult kullanmayın; Activity Result API'ye geçin.
Karmaşık Nesneleri Aktarma: Parcelable vs Serializable
Parcelable daha hızlıdır ve Android için önerilir. Kısaltılmış User örneği (Java):
public class User implements Parcelable {
private String name;
private int age;
// writeToParcel / CREATOR / Parcel'den oluşturulan kurucu
}
Aktarım:
intent.putExtra("user", user); // user Parcelable uygular
User user = getIntent().getParcelableExtra("user");
Nesne küçükse ve sizin için daha kolaysa Serializable kullanabilirsiniz, ancak ek yükü göz önünde bulundurun.
Navigation Component kullanan projeler için Safe Args kullanın; geçişler için tip güvenliği sağlayan argümanlar üretir.
Sık Yapılan Hatalar
- Extra varlığını kontrol etmemek:
intent.hasExtra("key")veya null kontrolleri kullanın. - Büyük verileri (Bitmap) Intent üzerinden aktarmak; bu hataya yol açar. Bunun yerine URI/bağlantı aktarın veya önbelleğe kaydedin.
- Hassas verileri (parolalar, token'lar) aktarmak güvensizdir; ADB günlüklerine düşebilirler.
- Yanlış Parcelable uygulaması; okuma sırasında null sonuç ve çökmelere neden olur.
SSS
-
Intent'te bir anahtarın olup olmadığını nasıl kontrol ederim?
if (intent != null && intent.hasExtra("key")) { ... }
-
Nesne Listesi aktarılabilir mi?
- Evet: basit listeler için
putParcelableArrayListExtraveyaputStringArrayListExtra.
- Evet: basit listeler için
-
Uygulamalar arası aktarım için hangisi daha iyi — Intent mi yoksa ContentProvider mı?
- Uygulama içinde kendi verilerinizi aktarmak için Intent kullanışlıdır; uygulamalar arasında büyük miktarda veriyi güvenli bir şekilde paylaşmak için ContentProvider daha iyidir.
Sonuç: Uygulama içi gezinme için basit extras ve açık Intent'lerle başlayın; nesneler için Parcelable kullanın ve veri döndürmek için Activity Result API'yi tercih edin. Gerekirse Kotlin örneklerinin tam sürümlerini veya Navigation Component ve Safe Args içeren bir örneği gönderebilirim.