Android'de Intent nasıl çalışır: action, activity ve map intent örneklerle
Intent, Android bileşenleri arasında eylemleri başlatmak için kullanılan bir nesnedir: açık (explicit) Intent'ler belirli bir Activity/Service'i hedef alır, kapalı (implicit) Intent'ler action (örneğin ACTION_VIEW) ve veriyi (URI) tanımlar; haritalar için ise geo: URI kullanılır; başlatma işlemi startActivity / startService aracılığıyla resolveActivity kontrolü veya yeni Activity Result API ile gerçekleştirilir.
Intent nedir ve türleri nelerdir
Intent, bileşenleri (Activity, Service, BroadcastReceiver) birbirine bağlar ve veri aktarır. Kısaca:
- Açık (explicit) — uygulamadaki belirli bir bileşeni belirtir: uygulamanız içinde gezinme için kullanılır.
- Kapalı (implicit) — bir eylemi (action) ve/veya veriyi belirtir; sistem diğer uygulamalarda uygun bir bileşen bulur.
- Kullanım amacına göre: Activity (kullanıcı arayüzü), Service (arka plan görevleri), Broadcast (yayın mesajları).
Intent yapısı örneği:
- action: Intent.ACTION_VIEW, Intent.ACTION_SEND vb.
- data/uri: Uri.parse("https://...") veya "geo:lat,lon?q=place"
- extras: putExtra ile anahtar/değer çiftleri
Action, Activity ve Map Intent — pratik örnekler
Açık Intent — aynı uygulamada bir Activity başlatma.
Kotlin:
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("userId", 42)
startActivity(intent)
Java:
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("userId", 42);
startActivity(intent);
Kapalı Intent — tarayıcıda bir bağlantı açma:
val uri = Uri.parse("https://example.com")
val intent = Intent(Intent.ACTION_VIEW, uri)
if (intent.resolveActivity(packageManager) != null) startActivity(intent)
Map Intent — haritalarda koordinatları açma veya yer arama:
// Etiketle birlikte koordinatları aç
val geoUri = Uri.parse("geo:34.99,-106.61?q=34.99,-106.61(Treasure)")
val mapIntent = Intent(Intent.ACTION_VIEW, geoUri)
mapIntent.setPackage("com.google.android.apps.maps") // isteğe bağlı — belirli bir uygulamayı çağır
if (mapIntent.resolveActivity(packageManager) != null) startActivity(mapIntent)
Veya kullanıcının uygulama seçmesine olanak tanımak için chooser kullanın:
val chooser = Intent.createChooser(mapIntent, "Şununla aç:")
startActivity(chooser)
Veri gönderme (ACTION_SEND):
val shareIntent = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "Gönderilecek metin")
}
startActivity(Intent.createChooser(shareIntent, "Paylaş"))
Service başlatma:
val svc = Intent(this, MyService::class.java)
startService(svc) // ön plan/arka plan servisleri için ContextCompat.startForegroundService kullanın, Android 8+ kısıtlamalarını dikkate alın
Bir Activity'den sonuç almanın modern yolu, eski startActivityForResult yerine Activity Result API kullanmaktır:
- ActivityResultLauncher'ı onCreate içinde kaydedin ve launcher.launch(intent) çağrısını yapın.
Kapalı bir Intent'i çağırmadan önce resolveActivity(packageManager) kontrolü yapın veya uygun işleyici yoksa çökme (Crash) önlemek için try/catch kullanın.
Kodla intent başlatırken en iyi uygulamalar
- Kapalı Intent'ler için her zaman resolveActivity(packageManager) kontrolü yapın.
- Hassas veriler için açık Intent'ler ve erişim izinleri kullanın.
- Kullanıcı deneyimini (UX) iyileştirmek için Intent.createChooser kullanın.
- Belirli bir uygulamaya güvenmeyin — kritik değilse seçim imkanı bırakın.
- Sonuç almak için Activity Result API (ActivityResultLauncher) kullanın.
- AndroidManifest.xml dosyasında
bildirimlerini ve gerekli izinleri belirtin. - Büyük nesneleri aktarmak için extras yerine yerel veritabanı/dosya/singleton kullanın.
Intent ile özel anahtarları veya büyük ikili verileri extras üzerinden göndermeyin — bu durum sızıntılara veya OOM (Out Of Memory) hatasına yol açabilir.
Sık yapılan hatalar
- resolveActivity kontrolü olmadan kapalı Intent başlatma — uygun uygulama olmayan cihazlarda uygulama çöker.
- putExtra ile büyük miktarda veri aktarma — OOM veya TransactionTooLargeException hatası.
- Activity Result API yerine eski startActivityForResult ile sonuç beklemek.
- geo: için yanlış URI belirtme — haritalar düzgün açılmaz.
SSS
-
Intent'in işleneceğini nasıl kontrol ederim?
intent.resolveActivity(packageManager) != null kullanın veya startActivity'i try/catch içine alın. -
Aktiviteleri AndroidManifest'e eklemem gerekir mi?
Evet, tüm Activity ve Service'ler manifestte bildirilmelidir (test/dinamik olarak kaydedilen bileşenler hariç). -
Google Maps'i tercih etmek için ne yapmalıyım?
setPackage("com.google.android.apps.maps") ayarlayın, ancak uygulama yüklü değilse Intent işlenmeyecektir. -
Başlatılan Activity'den sonucu nasıl alırım?
ActivityResultLauncher kaydedin ve ActivityResultContracts.StartActivityForResult sözleşmesini kullanın. -
Service veya BroadcastReceiver'dan Intent başlatabilir miyim?
Evet, ancak yeni Android sürümlerinde arka plandan Activity başlatma kısıtlamaları vardır — bildirimler/ön plan servisi kullanın veya UI thread'inde intent başlatın.
Gerekirse projeniz için hazır kod parçacıkları (Kotlin/Java) veya Activity Result API örneği ekleyebilirim.