Niyetler ve niyet filtreleri

Intent, başka bir uygulama bileşeninden işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir. Intent'ler, bileşenler arasındaki iletişimi çeşitli şekillerde kolaylaştırsa da üç temel kullanım alanı vardır:

  • Etkinlik başlatma

    Activity, bir uygulamadaki tek bir ekranı temsil eder. startActivity() öğesine bir Intent ileterek yeni bir Activity örneği başlatabilirsiniz. Intent, başlatılacak etkinliği açıklar ve gerekli verileri taşır.

    Etkinlik tamamlandığında sonuç almak istiyorsanız startActivityForResult() yöntemini çağırın. Etkinliğiniz, sonucu etkinliğinizin onActivityResult() geri çağırma işlevinde ayrı bir Intent nesnesi olarak alır. Daha fazla bilgi için Etkinlikler kılavuzuna bakın.

  • Hizmet başlatma

    Service, kullanıcı arayüzü olmadan arka planda işlem gerçekleştiren bir bileşendir. Android 5.0 (API düzeyi 21) ve sonraki sürümlerde JobScheduler ile bir hizmet başlatabilirsiniz. JobScheduler hakkında daha fazla bilgi için API-reference documentation sayfasını inceleyin.

    Android 5.0'dan (API düzeyi 21) önceki sürümlerde, Service sınıfının yöntemlerini kullanarak bir hizmet başlatabilirsiniz. Tek seferlik bir işlem (ör. dosya indirme) gerçekleştirmek için startService() yöntemine bir Intent ileterek hizmet başlatabilirsiniz. Intent, başlatılacak hizmeti açıklar ve gerekli verileri taşır.

    Hizmet, istemci-sunucu arayüzüyle tasarlanmışsa bindService() yöntemine bir Intent ileterek başka bir bileşenden hizmete bağlanabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzunu inceleyin.

  • Anons yapma

    Yayın, herhangi bir uygulamanın alabileceği bir mesajdır. Sistem, sistem etkinlikleri için çeşitli yayınlar sunar (ör. sistem başlatıldığında veya cihaz şarj olmaya başladığında). sendBroadcast() veya sendOrderedBroadcast() yöntemine bir Intent ileterek diğer uygulamalara yayın gönderebilirsiniz.

Bu sayfanın geri kalanında, amaçların işleyiş şekli ve nasıl kullanılacağı açıklanmaktadır. İlgili bilgiler için Diğer Uygulamalarla Etkileşimde Bulunma ve İçerik Paylaşma bölümlerini inceleyin.

Niyet türleri

İki tür intent vardır:

  • Açık intent'ler, tam bir ComponentName belirterek hangi uygulamanın hangi bileşeninin intent'i karşılayacağını belirtir. Başlatmak istediğiniz etkinliğin veya hizmetin sınıf adını bildiğiniz için genellikle kendi uygulamanızda bir bileşeni başlatmak için açık intent kullanırsınız. Örneğin, bir kullanıcı işlemine yanıt olarak uygulamanızda yeni bir etkinlik başlatabilir veya arka planda dosya indirmek için bir hizmet başlatabilirsiniz.
  • Örtük intent'ler belirli bir bileşeni adlandırmaz, bunun yerine gerçekleştirilecek genel bir işlem bildirir. Bu sayede başka bir uygulamadaki bir bileşen bu işlemi gerçekleştirebilir. Örneğin, kullanıcıya haritada bir konum göstermek istiyorsanız başka bir yetenekli uygulamanın haritada belirtilen konumu göstermesini istemek için örtük bir intent kullanabilirsiniz.

Şekil 1'de, bir etkinlik başlatılırken intent'in nasıl kullanıldığı gösterilmektedir. Intent nesnesi belirli bir etkinlik bileşenini açıkça adlandırdığında sistem bu bileşeni hemen başlatır.

Şekil 1. Dolaylı intent'in başka bir etkinliği başlatmak için sistem üzerinden nasıl iletildiği: [1] A etkinliği, eylem açıklaması içeren bir Intent oluşturur ve bunu startActivity()'e iletir. [2] Android sistemi, tüm uygulamalarda intent ile eşleşen bir intent filtresi arar. Eşleşme bulunduğunda [3] sistem, onCreate() yöntemini çağırıp Intent öğesini ileterek eşleşen etkinliği (B Etkinliği) başlatır.

Örtük intent kullandığınızda Android sistemi, intent'in içeriğini cihazdaki diğer uygulamaların manifesto dosyasında belirtilen intent filtreleriyle karşılaştırarak başlatılacak uygun bileşeni bulur. Intent bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve Intent nesnesini teslim eder. Birden fazla intent filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebilmesi için bir iletişim kutusu gösterir.

Intent filtresi, bir uygulamanın manifest dosyasında bulunan ve bileşenin almak istediği intent türlerini belirten bir ifadedir. Örneğin, bir etkinlik için intent filtresi tanımlayarak diğer uygulamaların etkinliğinizi belirli bir intent türüyle doğrudan başlatmasını sağlayabilirsiniz. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz bu etkinlik yalnızca açık bir intent ile başlatılabilir.

Dikkat: Uygulamanızın güvenli olduğundan emin olmak için Service başlatırken her zaman açık bir intent kullanın ve hizmetleriniz için intent filtreleri tanımlamayın. Bir hizmeti başlatmak için dolaylı intent kullanmak güvenlik açısından tehlikelidir. Çünkü hangi hizmetin intent'e yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başlatıldığını göremez. Android 5.0'dan (API düzeyi 21) itibaren sistem, örtük bir intent ile bindService() yöntemini çağırırsanız istisna oluşturur.

Niyet oluşturma

Intent nesnesi, Android sisteminin hangi bileşeni başlatacağını belirlemek için kullandığı bilgileri (ör. tam bileşen adı veya intent'i alması gereken bileşen kategorisi) ve alıcı bileşenin işlemi düzgün bir şekilde gerçekleştirmek için kullandığı bilgileri (ör. yapılacak işlem ve üzerinde işlem yapılacak veriler) taşır.

Intent içinde yer alan birincil bilgiler şunlardır:

Bileşen adı
Başlatılacak bileşenin adı.

Bu isteğe bağlıdır ancak bir intent'i açık yapan kritik bilgi parçasıdır. Yani intent yalnızca bileşen adı tarafından tanımlanan uygulama bileşenine teslim edilmelidir. Bileşen adı yoksa intent dolaylıdır ve sistem, diğer intent bilgilerine (aşağıda açıklanan işlem, veri ve kategori gibi) göre hangi bileşenin intent'i alması gerektiğine karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmeniz gerekir.

Not: Service başlatırken her zaman bileşen adını belirtin. Aksi takdirde, amaca hangi hizmetin yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başladığını göremez.

Intent öğesinin bu alanı bir ComponentName nesnesidir. Bu nesneyi, uygulamanın paket adı da dahil olmak üzere hedef bileşenin tam nitelikli sınıf adını kullanarak belirtebilirsiniz (ör. com.example.ExampleActivity). Bileşen adını setComponent(), setClass(), setClassName() veya Intent oluşturucu ile ayarlayabilirsiniz.

İşlem
Gerçekleştirilecek genel işlemi (ör. view veya pick) belirten bir dize.

Yayın intent'i söz konusu olduğunda bu, gerçekleşen ve bildirilen işlemdir. İşlem, intent'in geri kalanının nasıl yapılandırılacağını (özellikle de verilerde ve ekstralarda yer alan bilgileri) büyük ölçüde belirler.

Uygulamanızdaki intent'lerin kullanması (veya diğer uygulamaların uygulamanızdaki bileşenleri çağırması) için kendi işlemlerinizi belirtebilirsiniz ancak genellikle Intent sınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitlerini belirtirsiniz. Bir etkinliği başlatmak için yapılan yaygın işlemlerden bazıları şunlardır:

ACTION_VIEW
Bir etkinliğin kullanıcıya gösterebileceği bazı bilgiler (ör. galeri uygulamasında görüntülenecek bir fotoğraf veya harita uygulamasında görüntülenecek bir adres) olduğunda bu işlemi startActivity() ile bir intent'te kullanın.
ACTION_SEND
Paylaşma intent'i olarak da bilinen bu intent'i, kullanıcının başka bir uygulama (ör. e-posta uygulaması veya sosyal medya paylaşım uygulaması) aracılığıyla paylaşabileceği verileriniz olduğunda startActivity() ile birlikte kullanmanız gerekir.

Genel işlemleri tanımlayan diğer sabitler için Intent sınıf referansına bakın. Diğer işlemler, Android çerçevesinin başka yerlerinde tanımlanır. Örneğin, sistemin Ayarlar uygulamasında belirli ekranları açan işlemler Settings içinde tanımlanır.

Bir intent'in işlemini setAction() veya Intent oluşturucu ile belirtebilirsiniz.

Kendi işlemlerinizi tanımlarsanız aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını ön ek olarak eklediğinizden emin olun:

Kotlin

const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"

Java

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Veri
Üzerinde işlem yapılacak verileri ve/veya bu verilerin MIME türünü referans alan URI (bir Uri nesnesi). Sağlanan veri türü genellikle intent'in işlemi tarafından belirlenir. Örneğin, işlem ACTION_EDIT ise veriler, düzenlenecek dokümanın URI'sini içermelidir.

Intent oluştururken URI'nin yanı sıra veri türünü (MIME türü) belirtmek genellikle önemlidir. Örneğin, resim görüntüleyebilen bir etkinlik, URI biçimleri benzer olsa bile muhtemelen ses dosyası oynatamaz. Verilerinizin MIME türünü belirtmek, Android sisteminin intent'inizi alacak en iyi bileşeni bulmasına yardımcı olur. Ancak MIME türü bazen URI'dan (özellikle de veriler bir content: URI olduğunda) tahmin edilebilir. content: URI'si, verilerin cihazda bulunduğunu ve bir ContentProvider tarafından kontrol edildiğini gösterir. Bu sayede, veri MIME türü sistem tarafından görülebilir.

Yalnızca veri URI'sini ayarlamak için setData() yöntemini çağırın. Yalnızca MIME türünü ayarlamak için setType() yöntemini çağırın. Gerekirse setDataAndType() ile her ikisini de açıkça ayarlayabilirsiniz.

Dikkat: Hem URI hem de MIME türünü ayarlamak istiyorsanız setData() ve setType() yöntemlerini çağırmayın. Bu yöntemler birbirlerinin değerini geçersiz kılar. Hem URI hem de MIME türünü ayarlamak için her zaman setDataAndType() kullanın.

Kategori
Amacı işlemesi gereken bileşen türü hakkında ek bilgiler içeren bir dize. Bir amaca istediğiniz sayıda kategori açıklaması yerleştirebilirsiniz ancak çoğu amaç için kategori gerekmez. Yaygın olarak kullanılan bazı kategoriler şunlardır:
CATEGORY_BROWSABLE
Hedef etkinlik, bir bağlantının referans verdiği verileri (ör. resim veya e-posta mesajı) görüntülemek için bir web tarayıcısı tarafından başlatılmasına izin verir.
CATEGORY_LAUNCHER
Etkinlik, bir görevin ilk etkinliğidir ve sistemin uygulama başlatıcısında listelenir.

Kategorilerin tam listesi için Intent sınıf açıklamasına bakın.

addCategory() ile bir kategori belirtebilirsiniz.

Yukarıda listelenen bu özellikler (bileşen adı, işlem, veri ve kategori), bir intent'in tanımlayıcı özelliklerini temsil eder. Android sistemi bu özellikleri okuyarak hangi uygulama bileşenini başlatması gerektiğini belirleyebilir. Ancak intent, uygulama bileşenine nasıl çözümlendiğini etkilemeyen ek bilgiler taşıyabilir. Intent aşağıdaki bilgileri de sağlayabilir:

Ekstralar
İstenen işlemi gerçekleştirmek için gereken ek bilgileri taşıyan anahtar/değer çiftleri. Bazı işlemlerin belirli veri URI'leri kullanması gibi, bazı işlemler de belirli ekstralar kullanır.

Çeşitli putExtra() yöntemleriyle ek veriler ekleyebilirsiniz. Bu yöntemlerin her biri iki parametre kabul eder: anahtar adı ve değer. Ayrıca tüm ek verileri içeren bir Bundle nesnesi oluşturabilir, ardından Bundle nesnesini Intent içine putExtras() ile ekleyebilirsiniz.

Örneğin, ACTION_SEND ile e-posta göndermek için bir intent oluştururken to alıcısını EXTRA_EMAIL anahtarıyla, subject'i ise EXTRA_SUBJECT anahtarıyla belirtebilirsiniz.

Intent sınıfı, standartlaştırılmış veri türleri için birçok EXTRA_* sabiti belirtir. Kendi ek anahtarlarınızı (uygulamanızın aldığı intent'ler için) bildirmeniz gerekiyorsa aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını ön ek olarak eklediğinizden emin olun:

Kotlin

const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"

Java

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

Dikkat: Başka bir uygulamanın almasını beklediğiniz bir intent gönderirken Parcelable veya Serializable verilerini kullanmayın. Bir uygulama, Bundle nesnesindeki verilere erişmeye çalışır ancak paketlenmiş veya serileştirilmiş sınıfa erişimi yoksa sistem RuntimeException hatası verir.

İşaretler
İşaretler, intent için meta veri işlevi gören Intent sınıfında tanımlanır. İşaretler, Android sistemine bir etkinliğin nasıl başlatılacağını (örneğin, etkinliğin hangi göreve ait olması gerektiğini) ve başlatıldıktan sonra nasıl ele alınacağını (örneğin, son etkinlikler listesinde yer alıp almayacağını) bildirebilir.

Daha fazla bilgi için setFlags() yöntemine bakın.

Açık niyet örneği

Açık intent, uygulamanızdaki belirli bir etkinlik veya hizmet gibi belirli bir uygulama bileşenini başlatmak için kullandığınız intent'tir. Açık intent oluşturmak için Intent nesnesinin bileşen adını tanımlayın. Diğer tüm intent özellikleri isteğe bağlıdır.

Örneğin, uygulamanızda web'den dosya indirmek için tasarlanmış DownloadService adlı bir hizmet oluşturduysanız bu hizmeti aşağıdaki kodla başlatabilirsiniz:

Kotlin

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
val downloadIntent = Intent(this, DownloadService::class.java).apply {
    data = Uri.parse(fileUrl)
}
startService(downloadIntent)

Java

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

Intent(Context, Class) oluşturucusu, uygulamaya Context ve bileşene bir Class nesnesi sağlar. Bu nedenle, bu intent uygulamada DownloadService sınıfını açıkça başlatır.

Hizmet oluşturma ve başlatma hakkında daha fazla bilgi için Hizmetler kılavuzuna bakın.

Örtülü niyet örneği

Dolaylı intent, cihazda işlemi gerçekleştirebilecek herhangi bir uygulamayı çağırabilecek bir işlem belirtir. Örtük intent kullanmak, uygulamanızın işlemi gerçekleştiremediği ancak diğer uygulamaların muhtemelen gerçekleştirebileceği ve kullanıcının hangi uygulamayı kullanacağını seçmesini istediğiniz durumlarda faydalıdır.

Örneğin, kullanıcının diğer kişilerle paylaşmasını istediğiniz bir içeriğiniz varsa ACTION_SEND işlemiyle bir intent oluşturun ve paylaşılacak içeriği belirten ekstralar ekleyin. Bu amaçla startActivity() yöntemini çağırdığınızda kullanıcı, içeriği paylaşmak için bir uygulama seçebilir.

Kotlin

// Create the text message with a string.
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, textMessage)
    type = "text/plain"
}

// Try to invoke the intent.
try {
    startActivity(sendIntent)
} catch (e: ActivityNotFoundException) {
    // Define what your app should do if no activity can handle the intent.
}

Java

// Create the text message with a string.
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Try to invoke the intent.
try {
    startActivity(sendIntent);
} catch (ActivityNotFoundException e) {
    // Define what your app should do if no activity can handle the intent.
}

startActivity() çağrıldığında sistem, yüklü tüm uygulamaları inceleyerek bu tür bir intent'i (ACTION_SEND işlemi içeren ve "text/plain" verileri taşıyan bir intent) hangilerinin işleyebileceğini belirler. İşlemi gerçekleştirebilecek tek bir uygulama varsa bu uygulama hemen açılır ve intent'i alır. Başka hiçbir uygulama bu işlemi gerçekleştiremiyorsa uygulamanız, oluşan ActivityNotFoundException hatasını yakalayabilir. Birden fazla etkinlik intent'i kabul ederse sistem, Şekil 2'de gösterilene benzer bir iletişim kutusu gösterir. Böylece kullanıcı, hangi uygulamayı kullanacağını seçebilir.

Diğer uygulamaları başlatma hakkında daha fazla bilgi, kullanıcıyı başka bir uygulamaya gönderme ile ilgili kılavuzda da verilmektedir.

Şekil 2. Seçici iletişim kutusu.

Uygulama seçiciyi zorunlu kılma

Dolaylı niyetinize yanıt veren birden fazla uygulama olduğunda kullanıcı, hangi uygulamayı kullanacağını seçebilir ve bu uygulamayı işlem için varsayılan seçenek haline getirebilir. Varsayılan seçme özelliği, kullanıcının her seferinde aynı uygulamayı kullanmak isteyebileceği bir işlem gerçekleştirirken (ör. web sayfası açarken) yararlıdır (kullanıcılar genellikle tek bir web tarayıcısını tercih eder).

Ancak birden fazla uygulama intent'e yanıt verebiliyorsa ve kullanıcı her seferinde farklı bir uygulama kullanmak isteyebiliyorsa açıkça bir seçici iletişim kutusu göstermeniz gerekir. Seçici iletişim kutusu, kullanıcıdan işlem için hangi uygulamayı kullanacağını seçmesini ister (kullanıcı, işlem için varsayılan bir uygulama seçemez). Örneğin, uygulamanız ACTION_SEND işlemiyle "paylaşma" gerçekleştirdiğinde kullanıcılar mevcut durumlarına bağlı olarak farklı bir uygulama kullanarak paylaşmak isteyebilir. Bu nedenle, Şekil 2'de gösterildiği gibi her zaman seçici iletişim kutusunu kullanmanız gerekir.

Seçiciyi göstermek için createChooser() kullanarak bir Intent oluşturun ve aşağıdaki örnekte gösterildiği gibi startActivity() yöntemine iletin. Bu örnekte, createChooser() yöntemine iletilen amaca yanıt veren uygulamaların listesini içeren bir iletişim kutusu gösterilir ve sağlanan metin, iletişim kutusu başlığı olarak kullanılır.

Kotlin

val sendIntent = Intent(Intent.ACTION_SEND)
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
val title: String = resources.getString(R.string.chooser_title)
// Create intent to show the chooser dialog
val chooser: Intent = Intent.createChooser(sendIntent, title)

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(packageManager) != null) {
    startActivity(chooser)
}

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

Güvenli olmayan intent başlatma işlemlerini algılama

Uygulamanız, uygulamanızın içindeki bileşenler arasında gezinmek veya başka bir uygulama adına işlem yapmak için intent'leri başlatabilir. Android 12 (API düzeyi 31) ve sonraki sürümlerde, platform güvenliğini artırmak için uygulamanızın güvenli olmayan bir intent başlatması durumunda sizi uyaran bir hata ayıklama özelliği bulunur. Örneğin, uygulamanız başka bir intent'e ek olarak iletilen bir intent olan iç içe yerleştirilmiş intent'i güvenli olmayan bir şekilde başlatabilir.

Uygulamanız aşağıdaki işlemlerin ikisini de gerçekleştiriyorsa sistem, güvenli olmayan bir intent başlatma işlemi algılar ve StrictMode ihlali gerçekleşir:

  1. Uygulamanız, teslim edilen bir intent'in eklerinden iç içe yerleştirilmiş bir intent'i ayrıştırıyor.
  2. Uygulamanız, bu iç içe yerleştirilmiş intent'i kullanarak hemen bir uygulama bileşeni başlatır. Örneğin, intent'i startActivity(), startService() veya bindService()'a iletir.

Bu durumu nasıl tespit edeceğiniz ve uygulamanızda nasıl değişiklik yapacağınız hakkında daha fazla bilgi için Medium'da Android Nesting Intents (Android İç İçe Yerleştirme Amaçları) ile ilgili blog yayınını okuyun.

Güvenli olmayan intent başlatma işlemlerini kontrol etme

Uygulamanızda güvenli olmayan intent başlatma işlemlerini kontrol etmek için VmPolicy yapılandırırken aşağıdaki kod snippet'inde gösterildiği gibi detectUnsafeIntentLaunch() yöntemini çağırın. Uygulamanız bir StrictMode ihlali tespit ederse potansiyel olarak hassas bilgileri korumak için uygulamanın yürütülmesini durdurmak isteyebilirsiniz.

Kotlin

fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build())
}

Java

protected void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build());
}

Amaçları daha sorumlu bir şekilde kullanma

Güvenli olmayan intent başlatma ve StrictMode ihlali olasılığını en aza indirmek için aşağıdaki en iyi uygulamaları izleyin.

Yalnızca niyetlerdeki gerekli ekstraları kopyalayın ve gerekli temizleme ve doğrulama işlemlerini gerçekleştirin. Uygulamanız, ekstraları bir intent'ten yeni bir bileşen başlatmak için kullanılan başka bir intent'e kopyalayabilir. Bu durum, uygulamanız putExtras(Intent) veya putExtras(Bundle) yöntemini çağırdığında ortaya çıkar. Uygulamanız bu işlemlerden birini gerçekleştiriyorsa yalnızca alıcı bileşenin beklediği ekstraları kopyalayın. Kopyayı alan diğer intent, dışa aktarılmayan bir bileşeni başlatıyorsa ekstraları, bileşeni başlatan intent'e kopyalamadan önce temizleyin ve doğrulayın.

Uygulamanızın bileşenlerini gereksiz yere dışa aktarmayın. Örneğin, dahili bir iç içe yerleştirilmiş intent kullanarak bir uygulama bileşeni başlatmak istiyorsanız bu bileşenin android:exported özelliğini false olarak ayarlayın.

İç içe yerleştirilmiş niyet yerine PendingIntent kullanın. Bu sayede, başka bir uygulama, Intent içeren PendingIntent öğesini açtığında, diğer uygulama, uygulamanızın kimliğini kullanarak PendingIntent öğesini başlatabilir. Bu yapılandırma, diğer uygulamanın, uygulamanızdaki dışa aktarılmayan bileşenler de dahil olmak üzere tüm bileşenleri güvenli bir şekilde başlatmasına olanak tanır.

Şekil 2'deki diyagram, sistemin kontrolü sizin (istemci) uygulamanızdan başka bir (hizmet) uygulamasına ve tekrar sizin uygulamanıza nasıl aktardığını göstermektedir:

  1. Uygulamanız, başka bir uygulamada etkinlik çağıran bir intent oluşturur. Bu intent'e ek olarak bir PendingIntent nesnesi eklersiniz. Bu beklemede olan intent, uygulamanızdaki bir bileşeni çağırıyor. Bu bileşen dışa aktarılmıyor.
  2. Uygulamanızın intent'ini alan diğer uygulama, iç içe yerleştirilmiş PendingIntent nesnesini ayıklar.
  3. Diğer uygulama, PendingIntent nesnesinde send() yöntemini çağırır.
  4. Kontrolü uygulamanıza geri verdikten sonra sistem, uygulamanızın bağlamını kullanarak beklemede olan intent'i çağırır.

Şekil 2. İç içe yerleştirilmiş beklemede olan intent kullanılırken uygulamalar arası iletişimin şeması.

Örtülü intent alma

Uygulamanızın hangi örtülü intent'leri alabileceğini bildirmek için manifest dosyanızda <intent-filter> öğesiyle her bir uygulama bileşeniniz için bir veya daha fazla intent filtresi tanımlayın. Her intent filtresi, intent'in işlemine, verilerine ve kategorisine göre kabul ettiği intent türünü belirtir. Sistem, uygulama bileşeninize yalnızca intent, intent filtrelerinizden birinden geçebiliyorsa örtük bir intent gönderir.

Not: Belirgin intent, bileşenin beyan ettiği intent filtrelerinden bağımsız olarak her zaman hedefine ulaştırılır.

Bir uygulama bileşeni, yapabileceği her benzersiz iş için ayrı filtreler bildirmelidir. Örneğin, bir resim galerisi uygulamasındaki bir etkinliğin iki filtresi olabilir: resmi görüntülemek için bir filtre ve resmi düzenlemek için başka bir filtre. Etkinlik başladığında Intent öğesini inceler ve Intent içindeki bilgilere göre nasıl davranacağına karar verir (ör. düzenleyici kontrollerinin gösterilip gösterilmeyeceği).

Her intent filtresi, uygulamanın manifest dosyasındaki bir <intent-filter> öğesi tarafından tanımlanır ve ilgili uygulama bileşenine (ör. <activity> öğesi) yerleştirilir.

<intent-filter> öğesi içeren her uygulama bileşeninde android:exported için açıkça bir değer ayarlayın. Bu özellik, uygulama bileşenine diğer uygulamalar tarafından erişilip erişilemeyeceğini gösterir. Intent filtreleri LAUNCHER kategorisini içeren etkinlikler gibi bazı durumlarda bu özelliğin true olarak ayarlanması faydalı olur. Aksi takdirde bu özelliği false olarak ayarlamak daha güvenlidir.

Uyarı: Uygulamanızdaki bir etkinlik, hizmet veya yayın alıcı, intent filtreleri kullanıyor ve android:exported değerini açıkça ayarlamıyorsa uygulamanız Android 12 veya sonraki sürümleri çalıştıran bir cihaza yüklenemez.

<intent-filter> içinde, kabul edilecek intent türünü şu üç öğeden birini veya daha fazlasını kullanarak belirtebilirsiniz:

<action>
Kabul edilen intent işlemini name özelliğinde bildirir. Değer, sınıf sabiti değil, bir işlemin dize değeri olmalıdır.
<data>
Veri URI'sinin (scheme, host, port, path) ve MIME türünün çeşitli yönlerini belirten bir veya daha fazla özellik kullanarak kabul edilen veri türünü bildirir.
<category>
Kabul edilen intent kategorisini name özelliğinde bildirir. Değer, sınıf sabiti değil, bir işlemin dize değeri olmalıdır.

Not: Örtülü intent'leri almak için intent filtresine CATEGORY_DEFAULT kategorisini eklemeniz gerekir. startActivity() ve startActivityForResult() yöntemleri, tüm amaçları CATEGORY_DEFAULT kategorisini beyan etmiş gibi değerlendirir. Bu kategoriyi intent filtrenizde belirtmezseniz hiçbir örtük intent, etkinliğinize çözümlenmez.

Örneğin, veri türü metin olduğunda ACTION_SEND intent'ini almak için intent filtresi içeren bir etkinlik beyanı aşağıda verilmiştir:

<activity android:name="ShareActivity" android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

<action>, <data> veya <category> öğelerinden birden fazla örnek içeren bir filtre oluşturabilirsiniz. Bunu yaparsanız bileşenin bu filtre öğelerinin tüm kombinasyonlarını işleyebileceğinden emin olmanız gerekir.

Birden fazla intent türünü yalnızca belirli işlem, veri ve kategori türü kombinasyonlarında işlemek istediğinizde birden fazla intent filtresi oluşturmanız gerekir.

Örtük intent, intent'i üç öğenin her biriyle karşılaştırarak bir filtreye göre test edilir. Intent'in bileşene teslim edilmesi için üç testten de geçmesi gerekir. Bunlardan biri bile eşleşmezse Android sistemi, intent'i bileşene göndermez. Ancak bir bileşenin birden fazla intent filtresi olabileceğinden, bileşenin filtrelerinden birinden geçmeyen bir intent başka bir filtreden geçebilir. Sistemin amaçları nasıl çözdüğü hakkında daha fazla bilgiyi aşağıdaki Amaç Çözümleme bölümünde bulabilirsiniz.

Dikkat: Intent filtresi kullanmak, diğer uygulamaların bileşenlerinizi başlatmasını önlemenin güvenli bir yolu değildir. Intent filtreleri, bir bileşeni yalnızca belirli türdeki örtük intent'lere yanıt verecek şekilde kısıtlasa da geliştirici, bileşen adlarınızı belirlerse başka bir uygulama, açık bir intent kullanarak uygulama bileşeninizi başlatabilir. Bileşenlerinizden birini yalnızca kendi uygulamanızın başlatabilmesi önemliyse manifest dosyanızda intent filtreleri beyan etmeyin. Bunun yerine, ilgili bileşen için exported özelliğini "false" olarak ayarlayın.

Benzer şekilde, yanlışlıkla başka bir uygulamanın Service öğesini çalıştırmamak için kendi hizmetinizi başlatırken her zaman açık bir intent kullanın.

Not: Tüm etkinlikler için intent filtrelerinizi manifest dosyasında beyan etmeniz gerekir. Ancak yayın alıcıları için filtreler, registerReceiver() çağrılarak dinamik olarak kaydedilebilir. Ardından, unregisterReceiver() ile alıcının kaydını iptal edebilirsiniz. Böylece uygulamanız, yalnızca çalıştığı belirli bir süre boyunca belirli yayınları dinleyebilir.

Örnek filtreler

Intent filtresi davranışlarından bazılarını göstermek için sosyal paylaşım uygulamasının manifesto dosyasından bir örnek aşağıda verilmiştir:

<activity android:name="MainActivity" android:exported="true">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity" android:exported="false">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

İlk etkinlik olan MainActivity, uygulamanın ana giriş noktasıdır. Kullanıcı uygulamayı başlatıcı simgesiyle ilk kez başlattığında açılan etkinliktir:

  • ACTION_MAIN işlemi, bunun ana giriş noktası olduğunu gösterir ve herhangi bir intent verisi beklemez.
  • CATEGORY_LAUNCHER kategorisi, bu etkinliğin simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini gösterir. <activity> öğesi, icon ile bir simge belirtmiyorsa sistem, <application> öğesindeki simgeyi kullanır.

Etkinliğin uygulama başlatıcıda görünmesi için bu ikisinin birlikte eşlenmesi gerekir.

İkinci etkinlik olan ShareActivity, metin ve medya içeriği paylaşımını kolaylaştırmak için tasarlanmıştır. Kullanıcılar bu etkinliğe MainActivity üzerinden giderek girebilse de iki intent filtresinden biriyle eşleşen örtülü bir intent yayınlayan başka bir uygulamadan doğrudan ShareActivity etkinliğine de girebilirler.

Not: application/vnd.google.panorama360+jpg MIME türü, Google panorama API'leriyle işleyebileceğiniz panoramik fotoğrafları belirten özel bir veri türüdür.

Intent'leri diğer uygulamaların intent filtreleriyle eşleştirme

Başka bir uygulama Android 13 (API düzeyi 33) veya sonraki sürümleri hedefliyorsa uygulamanızın intent'ini yalnızca intent'iniz diğer uygulamadaki bir <intent-filter> öğesinin işlem ve kategorileriyle eşleşiyorsa işleyebilir. Sistem eşleşme bulamazsa ActivityNotFoundException hatası verir. Gönderen uygulama bu istisnayı işlemelidir.

Benzer şekilde, uygulamanızı Android 13 veya sonraki sürümleri hedefleyecek şekilde güncellerseniz harici uygulamalardan kaynaklanan tüm intent'ler, yalnızca uygulamanızın bildirdiği bir <intent-filter> öğesinin işlemleri ve kategorileriyle eşleşiyorsa uygulamanızın dışa aktarılan bir bileşenine gönderilir. Bu davranış, gönderen uygulamanın hedef SDK sürümünden bağımsız olarak gerçekleşir.

Aşağıdaki durumlarda niyet eşleştirme uygulanmaz:

  • Herhangi bir intent filtresi beyan etmeyen bileşenlere gönderilen intent'ler.
  • Aynı uygulamadan kaynaklanan intent'ler.
  • Sistemden kaynaklanan intent'ler, yani "sistem UID'sinden" (uid=1000) gönderilen intent'ler. Sistem uygulamaları arasında system_server ve android:sharedUserId değerini android.uid.system olarak ayarlayan uygulamalar yer alır.
  • Kökten kaynaklanan intent'ler.

Niyet eşleştirme hakkında daha fazla bilgi edinin.

Beklemede olan intent kullanma

PendingIntent nesnesi, Intent nesnesinin sarmalayıcısıdır. PendingIntent öğesinin temel amacı, yabancı bir uygulamaya, içerdiği Intent öğesini uygulamanızın kendi sürecinden yürütülüyormuş gibi kullanma izni vermektir.

Beklemede olan intent'lerin başlıca kullanım alanları şunlardır:

  • Kullanıcı bildiriminizle bir işlem gerçekleştirdiğinde yürütülecek bir intent bildirme (Android sisteminin NotificationManager öğesi Intent öğesini yürütür).
  • Kullanıcı Uygulama Widget'ınız ile bir işlem gerçekleştirdiğinde yürütülecek bir intent beyan etme (Ana ekran uygulaması Intent öğesini yürütür).
  • Gelecekte belirli bir zamanda yürütülecek bir intent bildirme (Android sisteminin AlarmManager sınıfı, Intent sınıfını yürütür).

Her Intent nesnesi belirli bir uygulama bileşeni türü (Activity, Service veya BroadcastReceiver) tarafından işlenecek şekilde tasarlandığı gibi, PendingIntent da aynı husus dikkate alınarak oluşturulmalıdır. Beklemede olan intent kullanırken uygulamanız, intent'i startActivity() gibi bir çağrıyla yürütmez. Bunun yerine, ilgili oluşturucu yöntemini çağırarak PendingIntent öğesini oluştururken amaçlanan bileşen türünü bildirmeniz gerekir:

Uygulamanız diğer uygulamalardan beklemede olan intent'ler almıyorsa PendingIntent oluşturmak için yukarıdaki yöntemler muhtemelen ihtiyacınız olan tek PendingIntent yöntemlerdir.

Her yöntem, mevcut uygulama Context, sarmalamak istediğiniz Intent ve intent'in nasıl kullanılması gerektiğini belirten bir veya daha fazla işaret (ör. intent'in birden fazla kez kullanılıp kullanılamayacağı) alır.

Beklemede olan intent'lerin kullanımı hakkında daha fazla bilgi için Bildirimler ve Uygulama Widget'ları API kılavuzları gibi ilgili kullanım alanlarının belgelerine bakın.

Değişebilirliği belirtme

Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa uygulamanızın oluşturduğu her PendingIntent nesnesinin değişkenliğini belirtmeniz gerekir. Belirli bir PendingIntent nesnesinin değiştirilebilir veya değiştirilemez olduğunu belirtmek için sırasıyla PendingIntent.FLAG_MUTABLE veya PendingIntent.FLAG_IMMUTABLE işaretini kullanın.

Uygulamanız, değişkenlik işaretlerinden birini ayarlamadan PendingIntent nesnesi oluşturmaya çalışırsa sistem IllegalArgumentException hatası verir ve Logcat'te aşağıdaki mesaj gösterilir:

PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.

Mümkün olduğunda sabit beklemede olan intent'ler oluşturma

Çoğu durumda uygulamanız, aşağıdaki kod snippet'inde gösterildiği gibi sabit PendingIntent nesneleri oluşturmalıdır. Bir PendingIntent nesnesi değiştirilemezse diğer uygulamalar, intent'i çağırma sonucunu ayarlamak için intent'i değiştiremez.

Kotlin

val pendingIntent = PendingIntent.getActivity(applicationContext,
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE)

Java

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE);

Ancak bazı kullanım alanlarında bunun yerine değiştirilebilir PendingIntent nesneleri gerekir:

  • Bildirimlerde hızlı yanıt işlemlerini destekleme. Hızlı yanıt, yanıtla ilişkili PendingIntent nesnesindeki klip verilerinde değişiklik yapılmasını gerektirir. Genellikle bu değişikliği, FILL_IN_CLIP_DATA değerini fillIn() yöntemine işaretçi olarak ileterek talep edersiniz.
  • CarAppExtender örneklerini kullanarak bildirimleri Android Auto çerçevesiyle ilişkilendirme.
  • PendingIntent örneklerini kullanarak görüşmeleri baloncuklara yerleştirme. Değiştirilebilir bir PendingIntent nesnesi, sistemin FLAG_ACTIVITY_MULTIPLE_TASK ve FLAG_ACTIVITY_NEW_DOCUMENT gibi doğru işaretleri uygulamasını sağlar.
  • requestLocationUpdates() veya benzer API'leri çağırarak cihazın konum bilgisini isteme Değiştirilebilir PendingIntent nesnesi, sistemin konum yaşam döngüsü olaylarını temsil eden intent ekstraları eklemesine olanak tanır. Bu etkinlikler arasında konum değişikliği ve bir sağlayıcının kullanılabilir hale gelmesi yer alır.
  • AlarmManager kullanarak alarm planlama Değiştirilebilir PendingIntent nesnesi, sistemin EXTRA_ALARM_COUNT intent ekini eklemesine olanak tanır. Bu ek bilgi, yinelenen bir alarmın kaç kez tetiklendiğini gösterir. Bu ek bilgiyi içeren intent, cihazın uyku modunda olduğu zamanlar gibi tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediğini bir uygulamaya doğru şekilde bildirebilir.

Uygulamanız değiştirilebilir bir PendingIntent nesnesi oluşturuyorsa açık intent kullanmanız ve ComponentName alanını doldurmanız önemle tavsiye edilir. Bu sayede, başka bir uygulama PendingIntent öğesini çağırıp kontrolü uygulamanıza geri verdiğinde uygulamanızdaki aynı bileşen her zaman başlatılır.

Beklemede olan intent'lerde açık intent'ler kullanma

Diğer uygulamaların, uygulamanızın beklemede olan intent'lerini nasıl kullanabileceğini daha iyi tanımlamak için beklemede olan intent'leri her zaman bir açık intent ile sarmalayın. Bu en iyi uygulamayı takip etmek için aşağıdakileri yapın:

  1. Temel intent'in action (işlem), package (paket) ve component (bileşen) alanlarının ayarlandığından emin olun.
  2. Beklemede olan intent'ler oluşturmak için Android 6.0'da (API düzeyi 23) eklenen FLAG_IMMUTABLE öğesini kullanın. Bu işaret, PendingIntent alan uygulamaların doldurulmamış özellikleri doldurmasını engeller. Uygulamanızın minSdkVersion değeri 22 veya daha düşükse aşağıdaki kodu kullanarak hem güvenliği hem de uyumluluğu sağlayabilirsiniz:

    if (Build.VERSION.SDK_INT >= 23) {
      // Create a PendingIntent using FLAG_IMMUTABLE.
    } else {
      // Existing code that creates a PendingIntent.
    }

Amaç çözünürlüğü

Sistem, bir etkinliği başlatmak için örtük bir intent aldığında, intent'i üç açıdan intent filtreleriyle karşılaştırarak intent için en iyi etkinliği arar:

  • İşlem.
  • Veriler (hem URI hem de veri türü).
  • Kategori.

Aşağıdaki bölümlerde, intent'lerin bir uygulamanın manifest dosyasındaki intent filtresi beyanına göre uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.

İşlem testi

Kabul edilen intent işlemlerini belirtmek için intent filtresi, aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <action> öğesi tanımlayabilir:

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

Bu filtrenin geçmesi için Intent içinde belirtilen işlemin, filtrede listelenen işlemlerden biriyle eşleşmesi gerekir.

Filtrede herhangi bir işlem listelenmiyorsa eşleşecek bir amaç yoktur. Bu nedenle, tüm amaçlar testte başarısız olur. Ancak bir Intent işlem belirtmiyorsa filtre en az bir işlem içerdiği sürece testi geçer.

Kategori testi

Kabul edilen intent kategorilerini belirtmek için intent filtresi, aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <category> öğesi bildirebilir:

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

Bir intent'in kategori testini geçmesi için Intent içindeki her kategorinin, filtredeki bir kategoriyle eşleşmesi gerekir. Bunun tersi gerekli değildir. Intent filtresi, Intent öğesinde belirtilenden daha fazla kategori bildirebilir ve Intent yine de başarılı olur. Bu nedenle, kategorisi olmayan bir intent, filtrede hangi kategorilerin beyan edildiğine bakılmaksızın bu testi her zaman geçer.

Not: Android, CATEGORY_DEFAULT kategorisini startActivity() ve startActivityForResult() yöntemlerine iletilen tüm örtük intent'lere otomatik olarak uygular. Etkinliğinizin örtük intent'leri almasını istiyorsanız önceki <intent-filter> örneğinde gösterildiği gibi intent filtrelerinde "android.intent.category.DEFAULT" için bir kategori içermesi gerekir.

Veri testi

Kabul edilen intent verilerini belirtmek için intent filtresi, aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <data> öğesi tanımlayabilir:

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>

Her <data> öğesi bir URI yapısı ve veri türü (MIME medya türü) belirtebilir. URI'nin her bir parçası ayrı bir özelliktir: scheme, host, port ve path:

<scheme>://<host>:<port>/<path>

Aşağıdaki örnekte bu özelliklerin olası değerleri gösterilmektedir:

content://com.example.project:200/folder/subfolder/etc

Bu URI'da şema content, ana makine com.example.project, bağlantı noktası 200 ve yol folder/subfolder/etc şeklindedir.

Bu özelliklerin her biri <data> öğesinde isteğe bağlıdır ancak doğrusal bağımlılıklar vardır:

  • Şema belirtilmezse ana makine yok sayılır.
  • Bir ana makine belirtilmezse bağlantı noktası yoksayılır.
  • Hem şema hem de ana makine belirtilmezse yol yoksayılır.

Bir intent'teki URI, bir filtredeki URI spesifikasyonuyla karşılaştırılırken yalnızca filtreye dahil edilen URI bölümleriyle karşılaştırılır. Örneğin:

  • Filtre yalnızca bir şema belirtiyorsa bu şemaya sahip tüm URI'lar filtreyle eşleşir.
  • Bir filtre bir şema ve yetki belirtiyor ancak yol belirtmiyorsa aynı şema ve yetkiye sahip tüm URI'lar, yollarından bağımsız olarak filtreyi geçer.
  • Bir filtrede şema, yetki ve yol belirtiliyorsa yalnızca aynı şema, yetki ve yola sahip URI'lar filtreden geçer.

Not: Yol spesifikasyonu, yol adının yalnızca kısmi eşleşmesini gerektirmek için joker karakter yıldız (*) içerebilir.

Veri testi, intent'teki hem URI'yi hem de MIME türünü, filtrede belirtilen bir URI ve MIME türüyle karşılaştırır. Kurallar aşağıdaki gibidir:

  1. URI veya MIME türü içermeyen bir intent, yalnızca filtrede URI veya MIME türü belirtilmemişse testi geçer.
  2. URI içeren ancak MIME türü içermeyen (açıkça belirtilmeyen veya URI'dan çıkarılamayan) bir intent, yalnızca URI'sı filtrenin URI biçimiyle eşleşirse ve filtre de MIME türü belirtmezse testi geçer.
  3. MIME türü içeren ancak URI içermeyen bir intent, yalnızca filtre aynı MIME türünü listeliyorsa ve bir URI biçimi belirtmiyorsa testi geçer.
  4. Hem URI hem de MIME türü (açık veya URI'den çıkarılabilir) içeren bir intent, testin MIME türü bölümünü yalnızca bu tür, filtrede listelenen bir türle eşleşirse geçer. URI'si filtredeki bir URI ile eşleşirse veya content: ya da file: URI'si varsa ve filtre bir URI belirtmiyorsa testin URI bölümünü geçer. Başka bir deyişle, filtresinde yalnızca bir MIME türü listeleniyorsa bileşenin content: ve file: verilerini desteklediği varsayılır.

Not: Bir intent, URI veya MIME türü belirtiyorsa <intent-filter> içinde <data> öğesi yoksa veri testi başarısız olur.

Bu son kural olan (d) kuralı, bileşenlerin bir dosya veya içerik sağlayıcıdan yerel veri alabilmesi beklentisini yansıtır. Bu nedenle, filtreleri yalnızca bir veri türünü listeleyebilir ve content: ile file: şemalarını açıkça adlandırmaları gerekmez. Aşağıdaki örnekte, bir <data> öğesinin Android'e bileşenin bir içerik sağlayıcıdan resim verileri alıp görüntüleyebileceğini bildirdiği tipik bir durum gösterilmektedir:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

Veri türü belirten ancak URI belirtmeyen filtreler, mevcut verilerin çoğu içerik sağlayıcılar tarafından dağıtıldığı için muhtemelen en yaygın filtrelerdir.

Diğer bir yaygın yapılandırma ise şema ve veri türü içeren bir filtredir. Örneğin, aşağıdaki gibi bir <data> öğesi, Android'e bileşenin işlemi gerçekleştirmek için ağdan video verileri alabileceğini bildirir:

<intent-filter>
    <data android:scheme="http" android:mimeType="video/*" />
    ...
</intent-filter>

Intent eşleşme

Intent'ler, yalnızca etkinleştirilecek hedef bileşeni bulmak için değil, aynı zamanda cihazdaki bileşen grubu hakkında bilgi edinmek için de intent filtreleriyle eşleştirilir. Örneğin, Home uygulaması, ACTION_MAIN işlemini ve CATEGORY_LAUNCHER kategorisini belirten intent filtrelerine sahip tüm etkinlikleri bularak uygulama başlatıcıyı doldurur. Eşleşmenin başarılı olması için Intent'teki işlemlerin ve kategorilerin filtreyle eşleşmesi gerekir. Bu konu, IntentFilter sınıfıyla ilgili dokümanlarda açıklanmıştır.

Uygulamanız, Home uygulamasının yaptığına benzer şekilde intent eşleştirmeyi kullanabilir. PackageManager, belirli bir intent'i kabul edebilecek tüm bileşenleri döndüren bir dizi query...() yöntemine ve bir intent'e yanıt verecek en iyi bileşeni belirleyen benzer bir resolve...() yöntemleri dizisine sahiptir. Örneğin, queryIntentActivities(), bağımsız değişken olarak iletilen intent'i gerçekleştirebilecek tüm etkinliklerin listesini döndürür, queryIntentServices() ise benzer bir hizmet listesi döndürür. İki yöntem de bileşenleri etkinleştirmez; yalnızca yanıt verebilecek bileşenleri listeler. Yayın alıcıları için de benzer bir yöntem olan queryBroadcastReceivers() kullanılabilir.