Intent Filter, AndroidManifest.xml içinde sistemin hangi örtük intentleri bir uygulama bileşeninin işleyebileceğini belirten bildirimsel bir ifadedir. Android Geliştirici Kılavuzuna göre, filtre action, category ve data içerir ve sistem bunlara dayanarak diğer uygulamalardan ve sistem olaylarından gelen çağrıları yönlendirir. Android geliştirme, farklı uygulamaların bileşenleri arasında gevşek bağlantının ana mekanizması olarak Intent Filter'ı kullanır.
Ana Noktalar
Intent Filter bir Android uygulamasının yapılandırma öğesidir ve sisteme bileşenin belirli türdeki örtük intentleri işleyebilme yeteneğini bildirir. Belirli bir sınıfı belirten açık Intentlerin aksine, örtük Intentler yalnızca gerekli eylemin bir tanımını içerir ve sistem, kayıtlı filtreler temelinde uygun bir bileşeni kendisi bulur.
Filtreler AndroidManifest.xml dosyasında bir bileşenin (Activity, Service veya BroadcastReceiver) içinde bildirilir. Her filtre birden fazla action, category ve data öğesi içerebilir. Bir bileşen sınırsız sayıda Intent Filter'a sahip olabilir ve her biri ayrı bir işleme senaryosunu tanımlar.
Intent Filter, uygulama bileşenleri arasında gevşek bağlantı ilkesini uygular. Uygulama A'nın Uygulama B'nin varlığını bilmesi gerekmez — yalnızca eylem açıklamasıyla bir Intent gönderir ve sistem filtreler temelinde bunu yönlendirir. Bu mekanizma Share Sheet, tarayıcı seçimi ve derin bağlantı işlemenin temelini oluşturur.
Açık Intentler başlatmak için belirli bir bileşen sınıfını belirtir. Geliştiricinin tam olarak hangi Activity'nin açılması gerektiğini bildiği durumlarda tek bir uygulama içinde iç navigasyon için kullanılır. Örtük Intentler yalnızca bir eylem tanımı içerir ve bileşen sistem tarafından dinamik olarak belirlenir.
Intent Filter yalnızca örtük Intentlerle çalışır. Bir Intent belirli bir sınıfı belirtiyorsa, sistem tüm filtreleri yok sayar ve belirtilen bileşeni doğrudan başlatır. Filtreler yalnızca örtük çağrılar çözümlenirken kontrol edilir, bu da onları uygulamalar arası etkileşimin anahtar öğesi yapar.
| Özellik | Açık Intent | Örtük Intent |
|---|---|---|
| Bileşen | Açıkça belirtilir (className) | Sistem tarafından belirlenir |
| Intent Filter | Gerekli değil | Gerekli |
| Örnek | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse(”https://example.com”)) |
| Güvenlik | Daha yüksek (ele geçirme yok) | Daha düşük (olası çatışmalar) |
Her Intent Filter üç grup öğeden oluşur — action, category ve data — bunların kombinasyonu bileşenin hangi Intentleri alacağını belirler. Intent her gruptan en az bir öğeyle eşleşiyorsa filtre karşılanmış sayılır.
Action gerçekleştirilen eylemi tanımlar — görüntüleme, düzenleme, gönderme. Category ek işlem bağlamı ekler — örneğin, tarayıcıdan başlatma yeteneği. Data URI veya MIME türü aracılığıyla işlenen bilgilerin biçimini tanımlar.
Kullanıcı profillerine bağlantılar açan bir Activity için Intent Filter örneği. Filtre, hassas yönlendirme için her üç grup öğeyi de içerir.
<activity android:name=".ProfileActivity">
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile" />
</intent-filter>
</activity>
category DEFAULTın zorunlu olarak belirtilmesine dikkat edin — bu olmadan sistem bileşene örtük Intentleri iletmez. BROWSABLE kategorisi, bağlantının tarayıcıdan işlenmesi gerekiyorsa eklenir.
Android'de bir derin bağlantı, action VIEW ve şema, ana bilgisayar ve yol içeren bir data etiketiyle Intent Filter üzerinden yapılandırılır. myapp://profile/42 gibi bir bağlantıyı izlerken, sistem eşleşen filtreye sahip bir Activity bulur ve iletilen URI ile başlatır. Tam eşleşme için pathPrefix, pathPattern veya path'i doğru yapılandırmak önemlidir.
Android 6'dan (API 23) başlayarak, HTTPS üzerinden doğrulanmış derin bağlantılar olan App Links desteği eklendi. App Linkler aynı Intent Filter'ı kullanır ancak Digital Asset Links aracılığıyla ek alan doğrulaması yapılır. Doğrulamadan sonra sistem, seçim iletişim kutusu olmadan uygulamayı otomatik olarak açar.
HTTPS bağlantısıyla doğrulama içeren App Link için filtre örneği. Bu durumda şema her zaman https'dir ve ana bilgisayar Digital Asset Links'te belirtilen alan adıyla eşleşir.
<intent-filter android:autoVerify="true">
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/profile" />
</intent-filter>
autoVerify özelliği, uygulama yüklendiğinde Digital Asset Links'i kontrol etmesi için sisteme talimat verir. Doğrulama başarıyla geçerse, uygulama belirtilen alan adı ve yollar için otomatik olarak varsayılan işleyici haline gelir.
Sistem Intent'i işlemek için bir bileşen seçtikten sonra, geliştiricinin hedef bileşen içinde gelen intent'ten veri çıkarması gerekir. Activity için onCreate() içinde getIntent() yöntemi kullanılır; BroadcastReceiver için, Intent'in parametre olarak iletildiği onReceive() yöntemi kullanılır.
Veri çıkarma, işlem türünü belirlemek için action, URI için data ve ek bilgiler için extra parametrelerin alınmasını içerir. Bu öğelerin her biri mevcut olmayabilir, bu nedenle kullanımdan önce null kontrolü zorunludur.
Kotlin'de bir Activity'de gelen derin bağlantıyı işleme örneği. Kod, Intent'ten URI'yi çıkarır ve ana bilgisayar ve yola dayalı olarak gezinme kararları alır.
class ProfileActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri = intent?.data
if (uri?.host == "profile") {
val userId = uri.lastPathSegment
loadProfile(userId)
}
}
}
Etkinlik gelen derin bağlantı olmadan başlatılabileceğinden, intent ve data'yı null için kontrol etmek amacıyla safe call operatörünü kullanmanız önerilir. Gezinmede kullanmadan önce host ve pathSegment'i null için kontrol etmelisiniz.
Birden fazla uygulama aynı örtük Intent ile eşleşen bir Intent Filter kaydettiyse, sistem kullanıcıya bir seçim iletişim kutusu gösterir. Kullanıcı tek kullanımlık bir uygulama seçebilir veya varsayılan bir işleyici ayarlayabilir. Android 10'dan itibaren, seçim iletişim kutusu yalnızca ilk çağrıda gösterilir, ardından sistem kullanıcının seçimini hatırlar.
Önceliği yönetmek için intent-filter etiketinde android:priority özelliği kullanılır. Değer ne kadar yüksekse, çatışmaları çözmede bileşenin önceliği o kadar yüksek olur. Ancak, öncelik farklı uygulamaların filtreleri için çalışmaz — bu durumda, hiçbir uygulama varsayılan olarak ayarlanmamışsa her zaman bir seçim iletişim kutusu gösterilir.
Geliştirici, Intent.createChooser() aracılığıyla programlı olarak seçim iletişim kutusunu çağırabilir, hedef Intent'i ve bir başlığı ileterek. Bu, varsayılan bir uygulama ayarlanmış olsa bile uygulamanın kullanıcıya açıkça bir işleyici seçme seğeneği sunmak istediğinde kullanışlıdır. Örneğin, ACTION_SEND aracılığıyla sosyal ağlara görüntü gönderirken createChooser ile varsayılan ayarlardan bağımsız olarak iletişim kutusunun gösterilmesi garanti edilir.
En sık yapılan hatalardan biri, Intent Filter'da DEFAULT kategorisinin bulunmamasıdır. Geliştiriciler yapılandırmayı örneklerden kopyalar ancak bu kategoriyi eklemeyi unutur, bunun sonucunda Activity örtük Intentleri almaz. Sistem örtük çağrılar için filtreyi görmez, ancak açık Intentler çalışmaya devam eder.
İkinci yaygın hata, tam URI olmadan data etiketinde scheme'in yanlış belirtilmesidir. Yalnızca şema belirtilip ana bilgisayar belirtilmezse, filtre herhangi bir kaynaktan bu şemaya sahip tüm bağlantıları kabul eder ve bu da güvenilmeyen kaynaklardan istenmeyen çağrılara yol açabilir. En azından scheme ve host'un her zaman belirtilmesi önerilir.
Üçüncü hata, Activity kodunda intent.data'nın null kontrolünün olmamasıdır. Activity derin bağlantı yoluyla değil de başlatıcıdan standart şekilde başlatılırsa, Intent bir URI içermez. Kontrol olmadan intent.data'ya erişmek NullPointerException'a ve uygulama çökmesine neden olur. Safe call operatörüyle her zaman intent?.data?.toString() kullanın.
Sıkça Sorulan Sorular
Evet, örtük Intentleri almak için DEFAULT kategorisi zorunludur. Bu olmadan, sistem bileşene örtük çağrıları iletmez ve Intent Filter yalnızca zaten filtreleri kontrol etmeyen açık Intentler için çalışır.
Bir sınır yoktur. Bir Activity herhangi bir sayıda Intent Filter içerebilir. Her filtre ayrı bir işleme senaryosunu tanımlar, örneğin biri derin bağlantılar için, diğeri dosya işleme için, üçüncüsü Share Sheet için.
Intent Filter, örtük Intentleri işlemek için genel bir mekanizmadır. App Link, Digital Asset Links aracılığıyla doğrulama içeren özel bir Intent Filter durumudur ve belirtilen bir alan adındaki HTTPS bağlantıları için uygulamayı otomatik olarak varsayılan işleyici olarak atar.
Evet, Intent Filter yalnızca Activity için değil, aynı zamanda Service ve BroadcastReceiver için de bildirilebilir. Service için bu, diğer uygulamalardan arka plan hizmeti çalıştırmaya izin verir; BroadcastReceiver için sistem yayın mesajlarını almaya izin verir.
MIME türü, data etiketinde mimeType özelliği aracılığıyla belirtilir. Filtre, bileşenin hangi veri türlerini işleyebileceğini belirler — örneğin, tüm görüntüler için image/* veya yalnızca düz metin için text/plain. MIME türleri URI şemasıyla birleştirilebilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun