Niyetler ve niyet filtreleri

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

  • Aktivite başlatma

    Activity, bir uygulamadaki tek bir ekranı temsil eder. startActivity() öğesine Intent geçirerek Activity öğesinin yeni bir örneğini başlatabilirsiniz. Intent, başlatılacak etkinliği tanımlar ve gerekli verileri taşır.

    Tamamlandığında etkinlikten sonuç almak istiyorsanız startActivityForResult() numaralı telefonu arayın. Etkinliğiniz, sonucu etkinliğinizin onActivityResult() geri çağırmasında 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 yapan bir bileşendir. Android 5.0 (API düzeyi 21) ve sonraki sürümlerde JobScheduler ile hizmet başlatabilirsiniz. JobScheduler hakkında daha fazla bilgi için şuraya bakın: API-reference documentation.

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

    Hizmet, istemci-sunucu arayüzüyle tasarlandıysa bindService() konumuna Intent ileterek başka bir bileşenden hizmete bağlanabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzuna bakın.

  • Yayın yapma

    Anons, tüm uygulamaların alabileceği bir mesajdır. Sistem, sistemin başlatılması veya cihazın şarj edilmeye başlaması gibi sistem etkinlikleri için çeşitli yayınlar sağlar. sendBroadcast() veya sendOrderedBroadcast() adlı cihaza 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çıklanmıştır. İlgili bilgiler için bkz. Diğer Uygulamalarla Etkileşim ve İçerik Paylaşma.

Amaç türleri

İki tür niyet vardır:

  • Açık intentler, tam ComponentName belirterek hangi uygulamanın amacı karşılayacağını belirtir. Başlatmak istediğiniz etkinliğin veya hizmetin sınıf adını bildiğinizden, genellikle kendi uygulamanızda bir bileşeni başlatmak için açık bir 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.
  • Dolaylı amaçlar, belirli bir bileşeni adlandırmaz. Bunun yerine, başka bir uygulamadaki bileşenin bu bileşeni işlemesine olanak tanıyan genel bir işlem bildirir. Örneğin, kullanıcıya haritada bir konum göstermek istiyorsanız, örtülü bir niyet kullanarak başka bir yetenekli uygulamanın haritada belirtilen bir konumu göstermesini isteyebilirsiniz.

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

Şekil 1. Dolaylı niyetin başka bir etkinlik başlatmak için sistem üzerinden nasıl teslim edildiği: [1] A Etkinliği, işlem açıklaması içeren bir Intent oluşturup startActivity() öğesine iletir. [2] Android Sistemi tüm uygulamalarda niyetle eşleşen bir intent filtresi arar. Eşleşme bulunduğunda, [3] sistem, onCreate() yöntemini çağırıp Intent değerini ileterek eşleştirme etkinliğini (B Etkinliği) başlatır.

Dolaylı intent kullandığınızda Android sistemi, niyetin içeriğini cihazdaki diğer uygulamaların manifest dosyasında belirtilen amaç filtreleriyle karşılaştırarak başlamak için uygun bileşeni bulur. Amaç bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve Intent nesnesini sunar. Birden çok intent filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebilmesi için bir iletişim kutusu görüntüler.

Amaç filtresi, bir uygulamanın manifest dosyasında bulunan ve bileşenin almak istediği niyet türlerini belirten bir ifadedir. Örneğin, bir etkinlik için intent filtresi tanımlayarak diğer uygulamaların etkinliğinizi belirli bir amaçla doğrudan başlatmasını mümkün kılarsınız. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz etkinlik yalnızca açık bir niyetle başlatılabilir.

Dikkat: Uygulamanızın güvenli olduğundan emin olmak için Service başlatırken her zaman açık bir amaç kullanın ve hizmetleriniz için intent filtreleri beyan etmeyin. Bir hizmeti başlatmak için dolaylı niyet kullanmak güvenlik açısından tehlikelidir. Çünkü hangi hizmetin amaca yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başladığını göremez. Android 5.0'dan (API düzeyi 21) başlayarak, bindService() öğesini dolaylı niyetle çağırırsanız sistem bir istisna atar.

Amaç oluşturma

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

Intent içeriğinde yer alan temel bilgiler şunlardır:

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

Bu isteğe bağlıdır ancak bir amacı açık yapan en önemli bilgi parçasıdır. Bu, niyetin yalnızca bileşen adı tarafından tanımlanan uygulama bileşenine gönderilmesi gerektiği anlamına gelir. Bileşen adı olmadan amaç dolaylı olur ve sistem, diğer amaç bilgilerine (işlem, veri ve kategori gibi aşağıda açıklanan işlem, veri ve kategori) dayanarak amacı hangi bileşenin alması gerektiğine karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmelisiniz.

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

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

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

Yayın amacı söz konusu olduğunda bu, gerçekleşmekte olan ve bildirilmekte olan işlemdir. Bu eylem büyük ölçüde amacın geri kalanının, özellikle de verilerde ve ekstralarda bulunan bilgileri nasıl yapılandırıldığını belirler.

Uygulamanızdaki amaçlara yönelik olarak (veya uygulamanızdaki bileşenleri çağırmak için diğer uygulamalar tarafından kullanılmak üzere) kendi işlemlerinizi belirtebilirsiniz. Ancak genellikle Intent sınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitleri belirtirsiniz. Bir etkinlik başlatırken sık yapılan 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) varsa bu işlemi startActivity() ile bir amaç için kullanın.
ACTION_SEND
Paylaşma amacı olarak da bilinen bu yöntemi, kullanıcının e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabileceği bazı verileriniz olduğunda startActivity() ile bir amaç doğrultusunda kullanmanız gerekir.

Genel işlemleri tanımlayan diğer sabit değerler için Intent sınıf referansına bakın. Diğer işlemler Android çerçevesinin başka bir bölümünde tanımlanır (ör. sistemin Ayarlar uygulamasında belirli ekranları açan işlemler için Settings).

Bir amaç için işlemi 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ı önek 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 verilere başvuruda bulunan URI'dır (bir Uri nesnesi) ve/veya bu verinin MIME türüne. Sağlanan veri türü genellikle amacın yaptığı işleme göre belirlenir. Örneğin, işlem ACTION_EDIT ise veriler düzenlenecek belgenin URI'sını içermelidir.

Niyet oluştururken genellikle URI'sına ek olarak veri türünü (MIME türü) belirtmek önemlidir. Örneğin, resimleri gösterebilen bir etkinlik, URI biçimleri benzer olsa bile büyük olasılıkla bir ses dosyasını çalamaz. Verilerinizin MIME türünü belirtmeniz, Android sisteminin niyetinizi alacak en iyi bileşeni bulmasına yardımcı olur. Bununla birlikte, özellikle veriler bir content: URI'sı olduğunda MIME türü bazen URI'den çıkarılabilir. content: URI'si, verilerin cihazda bulunduğunu ve bir ContentProvider tarafından kontrol edildiğini gösterir. Bu da veri MIME türünü sistem tarafından görünür hale getirir.

Yalnızca veri URI'sini ayarlamak için setData() çağrısı yapın. Yalnızca MIME türünü ayarlamak için setType() numaralı telefonu arayın. Gerekirse her ikisini de setDataAndType() ile açıkça ayarlayabilirsiniz.

Dikkat: Hem URI hem de MIME türünü ayarlamak istiyorsanız setData() ve setType() ifadelerini çağırmayın. Çünkü bu iki değer diğerinin 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 herhangi bir sayıda kategori açıklaması yerleştirilebilir, ancak çoğu amaç için kategori gerekmez. Genel kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE
Hedef etkinlik, bir bağlantı tarafından başvurulan resim veya e-posta mesajı gibi verileri görüntülemek için bir web tarayıcısı tarafından başlatılabilir.
CATEGORY_LAUNCHER
Etkinlik, görevin ilk faaliyetidir 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 kategori belirtebilirsiniz.

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

Ekstralar
İstenen işlemi gerçekleştirmek için gereken ek bilgileri içeren anahtar/değer çiftleri. Bazı işlemlerin belirli veri URI'si türlerini kullanması gibi, bazı eylemler de belirli ekstralar kullanır.

Her biri iki parametreyi kabul eden çeşitli putExtra() yöntemlerini kullanarak ekstra veri ekleyebilirsiniz: anahtar adı ve değer. Ayrıca, tüm ekstra verilerle bir Bundle nesnesi oluşturabilir, ardından Bundle öğesini putExtras() ile Intent öğesine ekleyebilirsiniz.

Örneğin, ACTION_SEND ile e-posta göndermek için niyet oluştururken EXTRA_EMAIL anahtarıyla alıcıyı, konu'yu 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 ekstra anahtarlarınızı bildirmeniz gerekiyorsa (uygulamanızın aldığı amaçlar için) aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını önek 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 niyet gönderirken Parcelable veya Serializable verilerini kullanmayın. Bir uygulama, bir Bundle nesnesindeki verilere erişmeye çalışırsa ancak ayrıştırılan veya serileştirilmiş sınıfa erişemezse sistem bir RuntimeException gönderir.

İşaretler
İşaretler, amaç için meta veri görevi gören Intent sınıfında tanımlanır. İşaretler, Android sistemine bir etkinliği nasıl başlatacağını (örneğin, etkinliğin hangi göreve ait olması gerektiği) ve başlatıldıktan sonra nasıl ele alacağını (örneğin, son etkinlikler listesinde olup olmadığı) bildirebilir.

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

Müstehcen amaç örneği

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

Örneğin, uygulamanızda web'den dosya indirmek üzere tasarlanan 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şturucu, Context uygulamasına ve bileşene bir Class nesnesi sağlar. Bu nedenle, bu amaç 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ü amaç örneği

Dolaylı intent, cihazda işlemi gerçekleştirebilen herhangi bir uygulamayı çağırabilecek işlemi belirtir. Dolaylı niyet kullanmak, uygulamanız işlemi gerçekleştiremediğinde kullanışlıdır, ancak diğer uygulamalar muhtemelen yapabilir ve kullanıcının hangi uygulamayı kullanacağını seçmesini isterseniz.

Örneğin, kullanıcının başkalarıyla paylaşmasını istediğiniz içeriğiniz varsa ACTION_SEND işlemiyle bir amaç oluşturun ve paylaşılacak içeriği belirten ekstra öğeler ekleyin. Bu amaçla startActivity() yöntemini çağırdığınızda kullanıcı, içeriği paylaşacağı uygulamayı 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 hangilerinin bu tür amaçları işleyebildiğini belirlemek için yüklü tüm uygulamaları inceler (ACTION_SEND işlemi olan ve "metin/düz" veriler taşıyan bir amaç). Bunu işleyebilecek tek bir uygulama varsa o uygulama hemen açılır ve amacı sağlanır. Başka hiçbir uygulama bunu işleyemezse uygulamanız gerçekleşen ActivityNotFoundException olayını yakalayabilir. Birden fazla etkinlik amacı kabul ederse sistem, Şekil 2'de gösterilene benzer bir iletişim kutusu görüntüler. Böylece kullanıcı hangi uygulamayı kullanacağını seçebilir.

Kullanıcıyı başka bir uygulamaya gönderme hakkındaki kılavuzda, diğer uygulamaları başlatma hakkında daha fazla bilgi de verilmiştir.

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

Uygulama seçiciyi zorunlu kılma

Dolaylı amacınıza 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 yapabilir. Varsayılan seçme özelliği, kullanıcının muhtemelen her seferinde aynı uygulamayı kullanmak istediği bir işlemi gerçekleştirirken (örneğin, bir web sayfasını açarken) (kullanıcılar genellikle yalnızca bir web tarayıcısını tercih eder) faydalı olur.

Ancak birden fazla uygulama amaca yanıt verebiliyorsa ve kullanıcı her seferinde farklı bir uygulama kullanmak istiyorsa açıkça bir seçici iletişim kutusu göstermeniz gerekir. Seçici iletişim kutusunda kullanıcıdan işlem için hangi uygulamanın kullanılacağını seçmesi istenir (kullanıcı işlem için varsayılan bir uygulama seçemez). Örneğin, uygulamanız ACTION_SEND işlemiyle "paylaş" işlemi gerçekleştirdiğinde, kullanıcılar mevcut durumlarına bağlı olarak farklı bir uygulama kullanarak paylaşımda bulunmak isteyebilirler. 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 bunu aşağıdaki örnekte gösterildiği gibi startActivity() işlevine iletin. Bu örnekte, createChooser() yöntemine iletilen amaca yanıt veren uygulamaların listesini içeren ve sağlanan metni iletişim kutusu başlığı olarak kullanan bir iletişim kutusu gösterilmektedir.

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 lansmanlarını tespit etme

Uygulamanız, uygulamanızın içindeki bileşenler arasında gezinmek veya başka bir uygulama adına işlem gerçekleştirmek için amaçlar başlatabilir. Android 12 (API düzeyi 31) ve sonraki sürümler, platform güvenliğini iyileştirmek için uygulamanızın güvenli olmayan bir niyet başlatması durumunda sizi uyaran bir hata ayıklama özelliği sunar. Örneğin, uygulamanız iç içe yerleştirilmiş intent'i güvenli olmayan bir şekilde başlatabilir. İç içe yerleştirilmiş niyet, başka bir amaçta ekstra olarak geçirilen bir amaçtır.

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

  1. Uygulamanız, iç içe yerleştirilmiş bir niyeti, teslim edilen amacın ek özelliklerinden ayırır.
  2. Uygulamanız, bu iç içe yerleştirilmiş niyeti kullanarak hemen bir uygulama bileşenini başlatır (ör. niyeti startActivity(), startService() veya bindService() içine iletmek).

Bu durumu tespit etme ve uygulamanızda değişiklik yapma hakkında daha fazla bilgi edinmek için Medium'daki Android İç İçe Yerleştirme Amaçları ile ilgili blog yayınını okuyun.

Güvenli olmayan intent lansmanları olup olmadığını kontrol etme

Uygulamanızda güvenli olmayan amaç başlatmaları olup olmadığını kontrol etmek için VmPolicy öğenizi yapılandırırken aşağıdaki kod snippet'inde gösterildiği gibi detectUnsafeIntentLaunch() çağrısı yapın. Uygulamanız StrictMode ihlali algılarsa hassas olabilecek bilgileri korumak için uygulama yürütmeyi 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 kullanın

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

Amaçlar dahilindeki yalnızca temel ekstraları kopyalayın ve gerekli tüm sağlık önlemlerini ve doğrulamaları yapın. Uygulamanız, bir amaçtaki ekstraları yeni bir bileşeni kullanıma sunmak için kullanılan başka bir amaca kopyalayabilir. Bu durum, uygulamanız putExtras(Intent) veya putExtras(Bundle) ifadesini çağırdığında gerçekleşir. Uygulamanız bu işlemlerden birini gerçekleştirirse yalnızca alma bileşeninin beklediği ekstraları kopyalayın. Diğer amaç (kopyayı alan) dışa aktarılmayan bir bileşeni başlatırsa bileşeni başlatan amaca kopyalamadan önce ekstraları temizleyin ve doğrulayın.

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

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

Şekil 2'deki şemada sistemin kontrolü (istemci) uygulamanızdan başka bir (hizmet) uygulamasına ve ardından uygulamanıza nasıl geri taşıdığı gösterilmektedir:

  1. Uygulamanız, başka bir uygulamadaki etkinliği çağıran bir niyet oluşturuyor. Bu niyete ekstra olarak bir PendingIntent nesnesi eklersiniz. Bu bekleyen niyet, uygulamanızda bir bileşeni çağırır; bu bileşen dışa aktarılmaz.
  2. Uygulamanızın amacını aldıktan sonra diğer uygulama iç içe yerleştirilmiş PendingIntent nesnesini çıkarır.
  3. Diğer uygulama, PendingIntent nesnesinde send() yöntemini çağırır.
  4. Kontrolü tekrar uygulamanıza geçirdikten sonra, sistem uygulamanızın bağlamını kullanarak bekleyen niyeti çağırır.

2. Şekil. İç içe yerleştirilmiş bekleme amacı kullanılırken uygulamalar arası iletişim şeması.

Dolaylı intent alma

Uygulamanızın alabileceği örtülü amaçların reklamını yapmak üzere manifest dosyanızda <intent-filter> öğesiyle birlikte uygulama bileşenlerinizin her biri için bir veya daha fazla intent filtresi tanımlayın. Her intent filtresi, amacın işlemine, verilerine ve kategorisine göre kabul ettiği niyet türlerini belirtir. Sistem, yalnızca niyetin intent filtrelerinizden birinden geçebilmesi durumunda uygulama bileşeninize dolaylı bir niyet sağlar.

Not: Açık bir amaç, bileşenin bildirdiği intent filtrelerinden bağımsız olarak her zaman hedefine iletilir.

Bir uygulama bileşeni, yapabileceği her benzersiz iş için ayrı filtreler beyan etmelidir. Örneğin, resim galerisi uygulamasındaki bir etkinliğin iki filtresi olabilir: bir 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 (düzenleyici kontrollerinin gösterilip gösterilmeyeceğine) karar verir.

Her amaç filtresi, uygulamanın manifest dosyasında karşılık gelen uygulama bileşenine (<activity> öğesi gibi) iç içe yerleştirilmiş bir <intent-filter> öğesiyle tanımlanır.

<intent-filter> öğesi içeren her uygulama bileşeninde, açık bir şekilde android:exported için bir değer ayarlayın. Bu özellik, uygulama bileşenine diğer uygulamaların erişip erişemeyeceğini ifade eder. Amaç filtreleri LAUNCHER kategorisini içeren etkinlikler gibi bazı durumlarda, bu özelliği true olarak ayarlamak yararlı olabilir. Aksi takdirde, bu özelliği false olarak ayarlamak daha güvenli olur.

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

<intent-filter> içinde aşağıdaki üç öğeden birini veya daha fazlasını kullanarak kabul edilecek niyet türlerini belirtebilirsiniz:

<action>
name özelliğinde kabul edilen amaç işlemini tanımlar. Değer, sınıf sabiti değil, 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 özelliği kullanarak, kabul edilen veri türünü tanımlar.
<category>
name özelliğinde kabul edilen amaç kategorisini belirtir. Değer, bir işlemin sınıf sabiti değil, değişmez dize değeri olmalıdır.

Not: Örtülü amaçları almak için intent filtresine CATEGORY_DEFAULT kategorisini eklemeniz gerekir. startActivity() ve startActivityForResult() yöntemleri, tüm amaçları CATEGORY_DEFAULT kategorisini bildirmiş gibi ele alır. Niyet filtrenizde bu kategoriyi belirtmezseniz etkinliğiniz için hiçbir dolaylı intent çözümlenmez.

Örneğin, veri türü metin olduğunda ACTION_SEND niyeti almak için amaç filtresi içeren bir etkinlik bildirimini burada görebilirsiniz:

<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>

Birden fazla <action>, <data> veya <category> örneği 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 çok amaç türünü, ancak yalnızca belirli eylem, veri ve kategori türü kombinasyonlarında işlemek istediğinizde, birden fazla amaç filtresi oluşturmanız gerekir.

Dolaylı intent, niyet üç öğenin her biriyle karşılaştırılarak bir filtreye karşı test edilir. Bileşene teslim edilmesi için amacın üç testten de geçmesi gerekir. Bunlardan birini bile eşleştiremezse Android sistemi, niyeti bileşene iletmez. Bununla birlikte, bir bileşenin birden fazla intent filtresi olabileceğinden, bileşenin filtrelerinden birinden geçmeyen bir amaç, başka bir filtreden geçebilir. Aşağıdaki Amaç Çözümlemesi bölümünde sistemin amaçları nasıl çözümlediğine dair daha fazla bilgi bulabilirsiniz.

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

Benzer şekilde, yanlışlıkla farklı bir uygulamanın Service çalıştırılmasını önlemek 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ı filtreleri, registerReceiver() çağrısı yapılarak dinamik bir şekilde kaydedilebilir. Ardından, alıcının unregisterReceiver() kaydını iptal edebilirsiniz. Bu, uygulamanızın çalışırken yalnızca belirli bir süre boyunca belirli yayınları dinlemesine olanak tanır.

Örnek filtreler

Amaç filtresi davranışlarının bazılarını göstermek için bir sosyal paylaşım uygulamasının manifest dosyasından bir örneği burada bulabilirsiniz:

<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 ve herhangi bir amaç verisi beklemediğini belirtir.
  • CATEGORY_LAUNCHER kategorisi, bu etkinlik simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini belirtir. <activity> öğesi, icon içeren bir simge belirtmiyorsa sistem, <application> öğesindeki simgeyi kullanır.

Etkinliğin uygulama başlatıcıda görünmesi için bu ikisi eşleştirilmelidir.

İkinci etkinlik olan ShareActivity, metin ve medya içeriğinin paylaşımını kolaylaştırmak için tasarlanmıştır. Kullanıcılar bu etkinliğe MainActivity uygulamasından gelerek girebilecek olsalar da, ShareActivity özelliğini doğrudan iki amaç filtresinden biriyle eşleşen örtülü niyet yayınlayan başka bir uygulamadan da girebilirler.

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

Amaçları diğer uygulamaların intent filtreleriyle eşleştirin

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

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

Aşağıdaki durumlarda, amaç eşleştirme zorunlu kılınmaz:

  • Niyet filtresi beyan etmeyen bileşenlere yayınlanan amaçlar.
  • Aynı uygulama içinden gelen amaçlar.
  • Sistemden gelen amaçlar; yani, "sistem UID'sinden" (uid=1000) gönderilen amaçlar. Sistem uygulamaları, system_server ve android:sharedUserId değerini android.uid.system olarak ayarlayan uygulamaları içerir.
  • Kökten gelen amaçlar.

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

Beklemedeki bir amaç kullanılıyor

PendingIntent nesnesi, Intent nesnesinin etrafındaki sarmalayıcıdır. PendingIntent öğesinin birincil amacı, yabancı bir uygulamaya, içerilen Intent öğesini uygulamanızın kendi işleminden alınmış gibi kullanma izni vermektir.

Beklemedeki bir amacın başlıca kullanım alanları aşağıdakileri içerir:

  • Kullanıcı, Bildiriminizle bir işlem gerçekleştirdiğinde yürütülecek bir niyet bildirme (Android sisteminin NotificationManager öğesi, Intent işlemini yürütür).
  • Kullanıcı Uygulama Widget'ınızla (Ana ekran uygulaması Intent) bir işlem gerçekleştirdiğinde yürütülecek bir niyet belirtme.
  • Belirtilen gelecekte yürütülecek bir niyet bildirme (Android sisteminin AlarmManager işlevi, Intent yürütür).

Her Intent nesnesinin belirli bir uygulama bileşeni türü (Activity, Service veya BroadcastReceiver) tarafından işlenecek şekilde tasarlanması gibi, PendingIntent öğesi de aynı şekilde oluşturulmalıdır. Beklemedeki bir niyet kullanılırken uygulamanız startActivity() gibi bir çağrıyla amacı yürütmez. Bunun yerine, PendingIntent öğesini oluşturduğunuzda ilgili içerik oluşturucu yöntemini çağırarak hedeflenen bileşen türünü tanımlamanız gerekir:

Uygulamanız diğer uygulamalardan bekleyen niyet almıyorsa, PendingIntent oluşturmak için yukarıdaki yöntemler muhtemelen ihtiyaç duyacağınız tek PendingIntent yöntemidir.

Her yöntem; geçerli Context uygulamasını, sarmalamak istediğiniz Intent uygulamasını ve amacın nasıl kullanılması gerektiğini belirten bir veya daha fazla işareti (ör. amacın birden fazla kez kullanılıp kullanılamayacağı) alır.

Bekleyen amaçları kullanma hakkında daha fazla bilgi için Bildirimler ve Uygulama Widget'ları API kılavuzları gibi ilgili kullanım alanları ile ilgili belgeleri inceleyin.

Değişkenliği belirtin

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

Uygulamanız değişkenlik işareti ayarlamadan PendingIntent nesnesi oluşturmaya çalışırsa sistem bir IllegalArgumentException gönderir ve Logcat'te aşağıdaki mesaj görünür:

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 bekleyen amaçlar oluşturun

Çoğu durumda uygulamanız, aşağıdaki kod snippet'inde gösterildiği gibi sabit PendingIntent nesneleri oluşturmalıdır. PendingIntent nesnesi sabitse diğer uygulamalar amacın çağrılmasının sonucunu ayarlamak için niyeti 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ı için bunun yerine değişken PendingIntent nesneleri gerekir:

  • Bildirimlerde doğrudan yanıt işlemlerini destekleme. Doğrudan yanıt, yanıtla ilişkilendirilmiş PendingIntent nesnesindeki klip verilerinde değişiklik yapılmasını gerektirir. Genellikle bu değişikliği, fillIn() yöntemine işaret olarak FILL_IN_CLIP_DATA ileterek talep edersiniz.
  • CarAppExtender örneklerini kullanarak bildirimleri Android Auto çerçevesiyle ilişkilendirme.
  • Görüşmeler, PendingIntent örnekleri kullanılarak balonlara yerleştiriliyor. Değişebilir PendingIntent nesnesi, sistemin FLAG_ACTIVITY_MULTIPLE_TASK ve FLAG_ACTIVITY_NEW_DOCUMENT gibi doğru işaretleri uygulamasına olanak tanır.
  • requestLocationUpdates() veya benzer API'leri çağırarak cihaz konum bilgilerini isteme. Değişebilir PendingIntent nesnesi, sistemin konum yaşam döngüsü olaylarını temsil eden amaç 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 ile alarm planlama. Değişebilir PendingIntent nesnesi, sistemin EXTRA_ALARM_COUNT amaç ekstrasını eklemesine olanak tanır. Bu ekstra değer, yinelenen bir alarmın kaç kez tetiklendiğini gösterir. Amaç, bu fazladan değeri içeren bir uygulamaya, tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediğini (örneğin, cihaz uyku modundayken) doğru bir şekilde bildirebilir.

Uygulamanız değişken bir PendingIntent nesnesi oluşturuyorsa açık niyet kullanmanız ve ComponentName alanını doldurmanız önemle tavsiye edilir. Bu şekilde, başka bir uygulama PendingIntent öğesini çağırıp kontrolü tekrar uygulamanıza aktardığında, uygulamanızdaki aynı bileşen her zaman başlar.

Beklemedeki amaçlar içinde açık intent'ler kullan

Diğer uygulamaların, uygulamanızın beklemedeki amaçlarını nasıl kullanabileceğini daha iyi tanımlamak için bekleyen niyeti her zaman açık niyetin etrafına sarmalayın. Bu en iyi uygulamadan yararlanmak için aşağıdakileri yapın:

  1. Temel amacın işlem, paket ve bileşen alanlarının ayarlandığından emin olun.
  2. Bekleyen amaçlar oluşturmak için Android 6.0'da (API düzeyi 23) eklenen FLAG_IMMUTABLE aracını 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 birlikte güvenlik ve uyumluluk 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 etkinlik başlatmak için dolaylı bir niyet aldığında, bunu üç unsura göre intent filtreleriyle karşılaştırarak amaca en uygun etkinliği arar:

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

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

İşlem testi

Bir amaç filtresi, kabul edilen amaç işlemlerini belirtmek için 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 filtreyi iletmek için Intent içinde belirtilen işlemin filtrede listelenen işlemlerden biriyle eşleşmesi gerekir.

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

Kategori testi

Bir amaç filtresi, kabul edilen amaç kategorilerini belirtmek için aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <category> öğesi tanımlayabilir:

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

Niyetin kategori testini geçebilmesi için Intent içindeki her kategorinin filtredeki bir kategoriyle eşleşmesi gerekir. Tersi gerekli değildir. Amaç filtresi, Intent içinde belirtilenden daha fazla kategori bildirebilir ve Intent yine de geçer. Bu nedenle, herhangi bir kategorisi olmayan bir amaç, filtrede hangi kategorilerin tanımlandığına bakılmaksızın her zaman bu testten geçer.

Not: Android, CATEGORY_DEFAULT kategorisini startActivity() ve startActivityForResult() öğesine iletilen tüm örtülü amaçlara otomatik olarak uygular. Etkinliğinizin örtülü amaçlar almasını istiyorsanız önceki <intent-filter> örneğinde gösterildiği gibi intent filtrelerinde "android.intent.category.DEFAULT" ile ilgili bir kategori içermelidir.

Veri testi

Bir amaç filtresi, kabul edilen amaç verilerini belirtmek için 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'nın her bölümü ayrı bir özelliktir: scheme, host, port ve path:

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

Aşağıdaki örnekte, bu özellikler için olası değerler gösterilmektedir:

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

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

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

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

Bir amaçtaki URI, bir filtredeki URI spesifikasyonuyla karşılaştırıldığında yalnızca URI'nın filtreye dahil edilen bölümleriyle karşılaştırılır. Örneğin:

  • Bir filtre yalnızca bir şemayı belirtiyorsa bu şemaya sahip tüm URI'ler filtreyle eşleşir.
  • Bir filtre bir şema ve bir yetki belirtir ancak yolu belirtmezse aynı şema ve yetkiliye sahip tüm URI'lar, yolları ne olursa olsun filtreyi geçirir.
  • Bir filtre bir şema, yetki ve yol belirtiyorsa yalnızca aynı şema, yetki ve yola sahip URI'lar filtreyi geçirir.

Not: Bir yol spesifikasyonu, yol adının yalnızca kısmi bir eşleşmesini gerektirecek şekilde bir joker karakter (*) içerebilir.

Veri testi, niyetteki URI ve 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 niyet, yalnızca filtre herhangi bir URI veya MIME türü belirtmiyorsa testi geçer.
  2. URI içeren ancak MIME türü içermeyen bir niyet (ne açık veya URI'dan çıkarılamaz) testi yalnızca URI'sının filtrenin URI biçimiyle eşleşmesi ve filtrenin de aynı şekilde bir MIME türü belirtmemesi durumunda geçer.
  3. MIME türü içeren ancak URI içermeyen bir niyet, 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'dan çıkarılabilir) içeren bir niyet, yalnızca bu türün filtrede listelenen bir türle eşleşmesi durumunda testin MIME türü kısmını geçer. URI'sı filtredeki bir URI ile eşleşiyorsa veya content: ya da file: URI'sına sahipse ve filtre bir URI belirtmiyorsa testin URI bölümünü geçirir. Başka bir deyişle, filtresinde yalnızca bir MIME türü listeleyen bileşenin content: ve file: verilerini desteklediği varsayılır.

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

Bu son kural (d) kuralı, bileşenlerin bir dosyadan veya içerik sağlayıcıdan yerel verileri alabilme beklentisini yansıtır. Bu nedenle, filtreleri yalnızca bir veri türünü listeleyebilir ve content: ve 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 alabileceğini ve gösterebileceğini bildirdiği tipik bir durum gösterilmektedir:

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

Veri türünü belirtip URI içermeyen filtreler, belki de en yaygın filtrelerdir, çünkü kullanılabilir verilerin çoğu içerik sağlayıcıları tarafından dağıtılmaktadır.

Yaygın olarak kullanılan diğer bir yapılandırma da ş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>

Amaç eşleştirme

Amaçlar, yalnızca etkinleştirilecek hedef bileşeni bulmak için değil, aynı zamanda cihazdaki bileşen grubu hakkında bir şeyler keşfetmek için de amaç 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. IntentFilter sınıfının dokümanlarında açıklandığı gibi, yalnızca Intent'teki eylemler ve kategoriler filtreyle eşleşirse eşleşme başarılı olur.

Uygulamanız, Home uygulamasının işlevine benzer bir şekilde amaç eşleştirmeyi kullanabilir. PackageManager, belirli bir amacı kabul edebilen tüm bileşenleri döndüren bir query...() yöntem grubuna ve bir amaca yanıt verecek en iyi bileşeni belirleyen benzer resolve...() yöntemlerine sahiptir. Örneğin, queryIntentActivities(), bağımsız değişken olarak aktarılan niyeti gerçekleştirebilecek tüm etkinliklerin listesini ve queryIntentServices(), benzer bir hizmet listesi döndürür. İki yöntem de bileşenleri etkinleştirmez; yalnızca yanıt verebilenleri listeler. Yayın alıcıları için queryBroadcastReceivers() adlı benzer bir yöntem vardır.