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, uygulamadaki tek bir ekranı temsil eder. startActivity()'a bir Intent göndererek yeni bir Activity örneği başlatabilirsiniz. Intent, başlayacak etkinliği açıklar ve gerekli tüm verileri taşır.

    Etkinlik tamamlandığında sonuç almak istiyorsanız startActivityForResult() numaralı telefonu arayı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ılavuzunu inceleyin.

  • 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 öğesine göz atın.

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

    Hizmet, istemci-sunucu arayüzüyle tasarlandıysa Intent öğesini bindService() öğesine aktararak hizmete başka bir bileşenden bağlanabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzunu inceleyin.

  • Yayın yapma

    Anons, tüm uygulamaların alabileceği mesajdır. Sistem, sistem etkinlikleri (ör. sistem açıldığında veya cihaz şarj etmeye başladığında) için çeşitli yayınlar yapar. Intent değerini sendBroadcast() veya sendOrderedBroadcast() değerine ileterek diğer uygulamalara yayın yayınlayabilirsiniz.

Bu sayfanın geri kalanında, intent'lerin 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 başlıklı makaleleri inceleyin.

Intent 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ğinizden, kendi uygulamanızda bir bileşeni başlatmak için genellikle 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ı intent'ler belirli bir bileşeni adlandırmaz, bunun yerine gerçekleştirilecek genel bir işlem tanımlar. Bu işlem, başka bir uygulamadaki bir bileşenin bu işlemi gerçekleştirmesine olanak tanır. Örneğin, kullanıcıya harita üzerinde bir konum göstermek istiyorsanız başka bir uygulamanın harita üzerinde belirli bir konumu göstermesini istemek için örtülü intent kullanabilirsiniz.

Şekil 1'de, etkinlik başlatılırken bir niyetin 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. Başka bir etkinliği başlatmak için sistem üzerinden nasıl bir dolaylı intent gönderilir? [1] A Etkinliği, işlem açıklaması içeren bir Intent oluşturur ve bunu startActivity()'e iletir. [2] Android sistemi, intent ile eşleşen bir intent filtresi için tüm uygulamaları arar. Bir eşleşme bulunduğunda [3] sistem, onCreate() yöntemini çağırarak ve Intent değerini ileterek eşleşen etkinliği (B Etkinliği) başlatır.

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

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 amaçla doğrudan başlatmasını sağlarsınız. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz etkinlik yalnızca açık bir amaçla başlatılabilir.

Dikkat: Uygulamanızın güvenliğini sağlamak 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 örtülü intent kullanmak güvenlik açısından risklidir. Bunun nedeni, hangi hizmetin intent'e yanıt vereceğinden emin olamama ve kullanıcının hangi hizmetin başlatıldığını görememesinden kaynaklanır. Android 5.0 (API düzeyi 21) sürümünden itibaren, bindService() metodunu implicit intent ile çağırırsanız sistem bir istisna atar.

Amaç oluşturma

Intent nesnesi, Android sisteminin hangi bileşenin başlatılacağını belirlemek için kullandığı bilgileri (ör. intent'i alması gereken bileşenin tam adı veya 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 işleme tabi tutulacak veriler) içerir.

Intent içinde bulunan birincil bilgiler şunlardır:

Bileşen adı
Başlanacak bileşenin adı.

Bu, isteğe bağlıdır ancak bir amacı açık hale getiren önemli bir bilgidir. Yani amacın yalnızca bileşen adıyla tanımlanan uygulama bileşenine iletilmesi gerekir. Bileşen adı olmadan intent örtülü olur ve sistem, intent'i hangi bileşenin alması gerektiğine diğer intent bilgilerine (ör. işlem, veri ve kategori) göre karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmeniz gerekir.

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

Intent nesnesinin bu alanı bir ComponentName nesnesi olup 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 kurucusuyla ayarlayabilirsiniz.

İşlem
Yapılacak genel işlemi belirten bir dize (ör. görüntüle veya seç).

Yayın amacı söz konusu olduğunda, gerçekleşen ve bildirilen işlem budur. İşlem, büyük ölçüde amacın geri kalanının nasıl yapılandırıldığını (özellikle de verilerde ve eklerde bulunan bilgileri) belirler.

Uygulamanızdaki intent'ler tarafından (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 sabitlerini belirtirsiniz. Etkinlik başlatmak için kullanabileceğiniz bazı yaygın işlemler şunlardır:

ACTION_VIEW
Bir etkinliğin kullanıcıya gösterebileceği bazı bilgilere sahip olduğunuzda (ör. bir galeri uygulamasında görüntülenecek bir fotoğraf veya bir harita uygulamasında görüntülenecek bir adres) bu işlemi startActivity() ile bir intent içinde kullanın.
ACTION_SEND
Paylaşım isteği olarak da bilinen bu isteği, kullanıcının e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabileceği verilere sahip olduğunuzda startActivity() ile bir istek içinde kullanmanız gerekir.

Genel işlemleri tanımlayan daha fazla sabit değer için Intent sınıf referansına bakın. Diğer işlemler, Android çerçevesinin başka bir yerinde (ör. sistemdeki Ayarlar uygulamasında belirli ekranları açan işlemler için Settings) tanımlanır.

Bir amaca yönelik işlemi setAction() veya bir Intent oluşturucuyla 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
İşlem yapılacak verilere atıfta bulunan URI (Uri nesnesi) ve/veya bu verilerin MIME türü. Sağlanan veri türü genellikle intent'in işlemine göre belirlenir. Örneğin, işlem ACTION_EDIT ise veriler, düzenlenecek dokümanın URI'sini içermelidir.

Bir intent oluştururken genellikle URI'sine ek olarak veri türünü (MIME türü) belirtmeniz gerekir. Örneğin, URI biçimleri benzer olsa bile resim görüntüleyebilen bir etkinlik muhtemelen ses dosyası oynatamayacaktır. 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'den çıkarılabilir. Özellikle veriler content: URI'si olduğunda bu geçerlidir. content: URI, verilerin cihazda bulunduğunu ve bir ContentProvider tarafından kontrol edildiğini belirtir. Bu da veri MIME türünü sisteme görünür hale getirir.

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

Dikkat: Hem URI'yi hem de MIME türünü ayarlamak istiyorsanız setData() ve setType()'i çağırmayın. Bu iki işlev birbirinin değerini geçersiz kılar. Hem URI'yi hem de MIME türünü ayarlamak için her zaman setDataAndType() kullanın.

Kategori
Amacın ele alması gereken bileşen türü hakkında ek bilgiler içeren bir dize. Bir intent'e istediğiniz sayıda kategori açıklaması yerleştirilebilir ancak çoğu intent için kategori gerekmez. Yaygın kategorilerden bazıları ş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 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 amacın tanımlayıcı özelliklerini temsil eder. Android sistemi bu özellikleri okuyarak, hangi uygulama bileşenini başlatması gerektiğini çözebilir. Ancak bir intent, uygulama bileşeninde nasıl çözüleceğini etkilemeyen ek bilgiler taşıyabilir. Intent'ler aşağıdaki bilgileri de sağlayabilir:

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

Her biri iki parametreyi (anahtar adı ve değer) kabul eden çeşitli putExtra() yöntemleriyle ek veri ekleyebilirsiniz. Ayrıca, tüm ek verileri içeren bir Bundle nesnesi oluşturabilir ve ardından putExtras() ile Bundle'yi Intent içine ekleyebilirsiniz.

Örneğin, ACTION_SEND ile e-posta göndermek için bir niyet oluştururken Alıcı alıcısını EXTRA_EMAIL anahtarıyla ve konuyu EXTRA_SUBJECT anahtarıyla belirtebilirsiniz.

Intent sınıfı, standartlaştırılmış veri türleri için birçok EXTRA_* sabit tanımlar. Kendi ek anahtarlarınızı tanımlamanız 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 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 bir RuntimeException oluşturur.

İş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 etkinliğin başlatıldıktan sonra nasıl ele alınacağını (örneğin, son etkinlikler listesine eklenip eklenmeyeceğini) bildirebilir.

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

Belirgin intent ö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 yöntemdir. Açık bir amaç 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şturucu, uygulama 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.

Örnek dolaylı intent

Örtük intent, cihazdaki herhangi bir uygulamayı çağırarak işlemi gerçekleştirebilecek bir işlem belirtir. Uygulamanız işlemi gerçekleştiremiyorsa ancak diğer uygulamalar muhtemelen gerçekleştirebiliyorsa ve kullanıcının hangi uygulamayı kullanacağını seçmesini istiyorsanız dolaylı intent kullanmak faydalıdır.

Örneğin, kullanıcının diğer kullanıcılarla paylaşmasını istediğiniz bir içeriğiniz varsa ACTION_SEND işlemiyle bir amaç oluşturun ve paylaşılacak içeriği belirten ekstra özellikler ekleyin. Bu amaca dayalı startActivity() etkinliğini ç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, bu tür bir intent'i (ACTION_SEND işlemine sahip ve "text/plain" veri taşıyan bir intent) hangilerinin işleyebileceğini belirlemek için yüklü tüm uygulamaları inceler. Bunu gerçekleştirebilecek tek bir uygulama varsa bu uygulama hemen açılır ve intent verilir. Başka hiçbir uygulama bunu yapamazsa uygulamanız meydana gelen ActivityNotFoundException durumunu yakalayabilir. Amacı birden fazla etkinlik 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.

Diğer uygulamaların başlatılmasıyla ilgili daha fazla bilgiyi, kullanıcıyı başka bir uygulamaya gönderme ile ilgili kılavuzda bulabilirsiniz.

Şekil 2. Bir seçici iletişim kutusu.

Uygulama seçiciyi zorunlu kılma

Örtük niyetinize yanıt veren birden fazla uygulama olduğunda kullanıcı, hangi uygulamanın kullanılacağını seçebilir ve bu uygulamayı işlem için varsayılan seçim yapabilir. Kullanıcının her zaman aynı uygulamayı kullanmak isteyeceği bir işlem gerçekleştirirken (ör. bir web sayfasını açarken) varsayılan seçim olanağı faydalı olur (kullanıcılar genellikle yalnızca bir web tarayıcısını tercih eder).

Bununla birlikte, birden fazla uygulama amaca yanıt verebiliyorsa ve kullanıcı her seferinde farklı bir uygulama kullanmak isteyebiliyorsa açık bir şekilde bir seçici iletişim kutusu göstermeniz gerekir. Seçici iletişim kutusu, kullanıcıdan işlem için hangi uygulamanın kullanılacağını seçmesini ister (kullanıcı işlem için varsayılan bir uygulama seçemez). Örneğin, uygulamanız ACTION_SEND işlemini "paylaştığında", kullanıcılar mevcut durumlarına bağlı olarak farklı bir uygulama kullanarak paylaşımda bulunmak isteyebilir. Bu nedenle, her zaman Şekil 2'de gösterildiği gibi 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()'ye iletin. Bu örnekte, createChooser() yöntemine aktarılan amaca yanıt veren uygulamaların listesinin yer aldığı bir iletişim kutusu gösterilir ve iletişim kutusu başlığı olarak sağlanan metni kullanı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şlatmalarını 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'ler başlatabilir. Platform güvenliğini artırmak amacıyla Android 12 (API düzeyi 31) ve sonraki sürümlerde, uygulamanız güvenli olmayan bir intent başlatırsa sizi uyaran bir hata ayıklama özelliği sunulur. Örneğin, uygulamanız başka bir intent'te ekstra 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ştirirse sistem, güvenli olmayan bir niyetin başlatılmasını algılar ve StrictMode ihlali gerçekleşir:

  1. Uygulamanız, iç içe yerleştirilmiş bir niyeti, teslim edilen bir niyetin ekstralarından ayrıştırıyor.
  2. Uygulamanız, bu iç içe yerleştirilmiş niyeti kullanarak hemen bir uygulama bileşeni başlatır (ör. niyeti startActivity(), startService() veya bindService()'a iletme).

Bu durumu nasıl tanımlayacağınız ve uygulamanızda değişiklik yapacağınız konusunda daha fazla bilgi için Medium'da Android Nesting Intents 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'ınızı yapılandırırken aşağıdaki kod snippet'inde gösterildiği gibi detectUnsafeIntentLaunch() işlevini çağırın. Uygulamanız StrictMode ihlali tespit ederse hassas olabilecek bilgileri korumak için uygulamanın yürütülmesini durdurabilirsiniz.

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());
}

Intent'leri 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.

Intent'lerdeki yalnızca gerekli ekstraları kopyalayın ve gerekli temizleme ve doğrulama işlemlerini yapın. Uygulamanız, ekstraları bir intent'ten yeni bir bileşeni başlatmak için kullanılan başka bir intent'e kopyalayabilir. Bu durum, uygulamanız putExtras(Intent) veya putExtras(Bundle)'i aradığında gerçekleşir. 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, iç içe yerleştirilmiş intent kullanarak bir uygulama bileşenini başlatmak istiyorsanız bileşenin android:exported özelliğini false olarak ayarlayın.

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

2. görseldeki şemada, sistemin kontrolü (istemci) uygulamanızdan başka bir (hizmet) uygulamasına ve tekrar uygulamanıza nasıl aktardığı gösterilmektedir:

  1. Uygulamanız, başka bir uygulamada etkinlik çağıran bir intent oluşturur. Bu intent'e ek olarak bir PendingIntent nesnesi eklersiniz. Bu bekleyen intent, uygulamanızda bir bileşeni çağırıyor. Bu bileşen dışa aktarılmıyor.
  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. Sistem, kontrolü uygulamanıza geri verdikten sonra uygulamanızın bağlamını kullanarak bekleyen intent'i çağırır.

Şekil 2. İç içe yerleştirilmiş bekleyen intent kullanıldığında uygulama içi iletişim şeması.

Dolaylı intent alma

Uygulamanızın hangi gizli intent'leri alabileceğini belirtmek için manifest dosyanızda uygulama bileşenlerinizin her biri için bir veya daha fazla intent filtresi tanımlayın.<intent-filter> Her intent filtresi, intent'in işlemine, verilerine ve kategorisine göre kabul ettiği intent türlerini belirtir. Sistem, yalnızca niyetin intent filtrelerinizden birinden geçebilmesi durumunda uygulama bileşeninize örtülü bir intent sunar.

Not: Belirli bir intent, bileşenin beyan ettiği intent filtrelerinden bağımsız olarak her zaman hedefine yayınlanır.

Bir uygulama bileşeni, yapabileceği her benzersiz iş için ayrı filtreler tanımlamalıdır. Örneğin, bir resim galerisi uygulamasındaki bir etkinlikte iki filtre olabilir: bir resim görüntülemek için bir filtre ve bir resim düzenlemek için başka bir filtre. Etkinlik başladığında Intent öğesini inceler ve Intent'teki bilgilere göre nasıl davranacağına karar verir (ör. düzenleyici kontrollerini gösterme veya göstermeme).Intent

Her intent filtresi, uygulamanın manifest dosyasında bir <intent-filter> öğesiyle 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şeninin diğer uygulamalar tarafından erişilebilir olup olmadığını belirtir. Amaç filtreleri LAUNCHER kategorisini içeren etkinlikler gibi bazı durumlarda, bu özelliğin true olarak ayarlanması yararlı olur. Aksi takdirde, bu özelliği false olarak ayarlamak daha güvenlidir.

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

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

<action>
name özelliğinde, intent işleminin kabul edildiğini belirtir. Değer, sınıf sabiti değil, işlemin düz 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, intent kategorisinin kabul edildiğini belirtir. Değer, sınıf sabit değeri değil, bir işlemin değişmez dize değeri olmalıdır.

Not: Örtük intent'ler almak için intent filtresine CATEGORY_DEFAULT kategorisini eklemeniz gerekir. startActivity() ve startActivityForResult() yöntemleri, tüm intent'leri CATEGORY_DEFAULT kategorisini belirtmiş gibi işler. Intent filtrenizde bu kategoriyi belirtmezseniz hiçbir implicit intent etkinliğinizle çözülmez.

Örneğin, veri türü metin olduğunda ACTION_SEND niyetini almak için intent filtresi içeren bir etkinlik beyanını aşağıda 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>

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

Birden çok amaç türünü yalnızca belirli eylem, veri ve kategori türü kombinasyonlarıyla ele almak istiyorsanız birden fazla intent filtresi oluşturmanız gerekir.

Örtülü niyet, amaç üç öğenin her biriyle karşılaştırılarak bir filtreye karşı test edilir. Amacın, bileşene yayınlanması için üç testten de geçmesi gerekir. Bunlardan biriyle bile eşleşemezse Android sistemi, intent'i bileşene iletmez. Bununla birlikte, bir bileşende 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ümü bölümünde bulabilirsiniz.

Dikkat: Amaç filtresi kullanmak, diğer uygulamaların bileşenlerinizi başlatmasını engellemenin güvenli bir yolu değildir. Amaç filtreleri bir bileşeni yalnızca belirli örtülü niyet türlerine yanıt verecek şekilde kısıtlasa da başka bir uygulama, bileşen adlarınızı geliştirici belirlerse açık bir amaç kullanarak uygulama bileşeninizi başlatabilir. Yalnızca kendi uygulamanızın bileşenlerinizden birini başlatabilmesi önemliyse manifest dosyanızda intent filtreleri tanımlamayın. Bunun yerine, 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şlatmak üzere her zaman açık bir intent kullanın.

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

Örnek filtreler

Intent filtresi davranışlarından bazılarını göstermek için aşağıda, sosyal paylaşım uygulamasının manifest dosyasından bir örnek 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 (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 belirtir 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> öğesinde icon ile bir simge belirtilmezse sistem, <application> öğesindeki simgeyi kullanır.

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

İkinci etkinlik olan ShareActivity, metin ve medya içeriğini paylaşmayı kolaylaştırmayı amaçlar. Kullanıcılar bu etkinliğe MainActivity üzerinden giderek bu etkinliğe girebilse de doğrudan, iki intent filtresinden biriyle eşleşen örtülü niyet sunan başka bir uygulamadan da ShareActivity girebilirler.

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

Niyetleri diğer uygulamaların intent filtreleriyle eşleştirme

Android 13 (API düzeyi 33) veya sonraki sürümleri hedefleyen başka bir uygulama, yalnızca amacınızın diğer uygulamadaki bir <intent-filter> öğesinin işlemleri ve kategorileriyle eşleşmesi durumunda uygulamanızın amacını işleyebilir. Sistem bir eşleşme bulamazsa ActivityNotFoundException atar. Gönderen uygulama bu istisnayı ele almalıdır.

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

Aşağıdaki durumlarda intent eşleştirme zorunlu kılınmaz:

  • Niyet filtresi tanımlamayan bileşenlere iletilen niyetler.
  • Kaynağı aynı uygulama içinde olan amaçlar.
  • Sistemden gelen intent'ler (yani "sistem UID'si"nden (uid=1000) gönderilen intent'ler). Sistem uygulamaları, system_server ve android:sharedUserId değerini android.uid.system olarak ayarlayan uygulamaları içerir.
  • Kökten gelen intent'ler.

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

Beklemedeki bir amacı kullanma

PendingIntent nesnesi, Intent nesnesini saran bir sarmalayıcıdır. PendingIntent'ün birincil amacı, harici bir uygulamaya, içerdiği Intent'yi uygulamanızın kendi sürecinden yürütülüyormuş gibi kullanma izni vermektir.

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

  • Kullanıcı bildiriminizle bir işlem gerçekleştirdiğinde çalıştırılacak bir intent beyan etme (Android sisteminin NotificationManager, Intent'ı yürütür).
  • Kullanıcı uygulama widget'ınızla bir işlem gerçekleştirdiğinde çalıştırılacak bir intent beyan etme (Intent, ana ekran uygulaması tarafından yürütülür).
  • Gelecekteki bir zamanda yürütülecek bir niyetin bildirilmesi (Android sisteminin AlarmManager özelliği, Intent komutunu yürütür).

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

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

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

Beklemedeki intent'leri kullanma hakkında daha fazla bilgi için ilgili kullanım alanlarının belgelerine (ör. Bildirimler ve Uygulama Widget'ları API kılavuzları) bakın.

Değişkenliğ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 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şaretini ayarlamadan PendingIntent nesnesi oluşturmaya çalışırsa sistem bir IllegalArgumentException hatası verir 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 bekleyen ve değiştirilemeyen intent'ler oluşturun

Çoğu durumda uygulamanız, aşağıdaki kod snippet'inde gösterildiği gibi değişmez 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 belirli kullanım alanları bunun yerine değiştirilebilir PendingIntent nesneleri gerektirir:

  • Bildirimlerde doğrudan yanıt işlemlerini destekleme. Doğrudan yanıt, yanıtla ilişkili PendingIntent nesnesinde klip verilerinde bir değişiklik yapılmasını gerektirir. Genellikle bu değişikliği, fillIn() yöntemine FILL_IN_CLIP_DATA işaretini göndererek istersiniz.
  • CarAppExtender örneklerini kullanarak bildirimleri Android Auto çerçevesiyle ilişkilendirme
  • PendingIntent örneklerini kullanarak görüşmeleri baloncuklara yerleştirme. Değişebilir bir 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 konumu bilgisi isteme Değişken PendingIntent nesnesi, sistemin konum yaşam döngüsü etkinliklerini 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'u kullanarak alarm planlama. Değiştirilebilir PendingIntent nesnesi, sistemin EXTRA_ALARM_COUNT intent'i ek olarak eklemesine olanak tanır. Bu ek, tekrarlanan bir alarmın kaç kez tetiklendiğini gösterir. Bu ek bilgi sayesinde intent, tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediği (ör. cihaz uykudayken) konusunda uygulamayı doğru bir şekilde bilgilendirebilir.

Uygulamanız değiştirilebilir bir PendingIntent nesnesi oluşturuyorsa açık intent kullanmanız ve ComponentName doldurmanız önemle tavsiye edilir. Bu sayede, başka bir uygulama PendingIntent'ü çağrdığında ve kontrolü uygulamanıza geri aktardığında uygulamanızda her zaman aynı bileşen başlar.

Beklemede olan intent'lerde belirgin intent'leri kullanma

Diğer uygulamaların, uygulamanızın bekleyen intent'lerini nasıl kullanabileceğini daha iyi tanımlamak için bekleyen intent'leri her zaman bir açık intent içine sarmalayın. Bu en iyi uygulamayı uygulamanıza yardımcı olması 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. Bekleyen intent'ler oluşturmak için Android 6.0 (API düzeyi 23) sürümüne eklenen FLAG_IMMUTABLE'i kullanın. Bu işaret, PendingIntent alan uygulamaların doldurulmamış özellikleri doldurmasını engeller. Uygulamanızın minSdkVersion sürümü 22 veya daha düşükse aşağıdaki kodu kullanarak güvenliği ve uyumluluğu birlikte sağlayabilirsiniz:

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

Amaç çözümü

Sistem, bir etkinliği başlatmak için dolaylı bir intent aldığında, intent'i üç unsura göre 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, amaçların bir uygulamanın manifest dosyasındaki intent filtresi bildirimine göre uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.

İşlem testi

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

<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 bölümünde belirtilen işlemin, filtrede listelenen işlemlerden biriyle eşleşmesi gerekir.

Filtre herhangi bir işlem listelemiyorsa niyetlerin eşleşeceği bir şey yoktur. Bu nedenle tüm niyetler testte başarısız olur. Bununla birlikte, Intent bir 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 tanımlayabilir:

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

Bir amacın kategori testini geçebilmesi için Intent içindeki her kategorinin filtredeki bir kategoriyle eşleşmesi gerekir. Bunun tersi gerekli değildir. Amaç filtresi, Intent özelliğinde belirtilenden daha fazla kategori bildirebilir ve Intent yine de başarılı olur. Bu nedenle, filtrede hangi kategorilerin tanımlandığına bakılmaksızın, kategori içermeyen bir intent her zaman bu testi geçer.

Not: Android, startActivity() ve startActivityForResult()'e iletilen tüm örtülü intent'lere otomatik olarak CATEGORY_DEFAULT kategorisini uygular. Etkinliğinizin, ö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ünü (MIME medya türü) belirtebilir. URI'nin her bölümü 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'de şema content, ana makine com.example.project, bağlantı noktası 200 ve yol folder/subfolder/etc'dır.

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 yoksayılır.
  • Ana makine belirtilmezse bağlantı noktası yok sayılır.
  • Hem şema hem de ana makine belirtilmezse yol yoksayılır.

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

  • Bir filtre yalnızca bir şema belirtirse bu şemaya sahip tüm URI'ler filtreyle eşleşir.
  • Bir filtrede şema ve yetkili belirtilmişse ancak yol belirtilmemişse aynı şemaya ve yetkiliye sahip tüm URI'ler, yollarından bağımsız olarak filtreden geçer.
  • Bir filtrede bir şema, yetkili ve yol belirtilirse yalnızca aynı şemaya, yetkiliye ve yola sahip URI'ler filtreden geçer.

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

Veri testi, amaçtaki hem URI hem de MIME türünü, filtrede belirtilen bir URI ve MIME türüyle karşılaştırır. Kurallar şunlardır:

  1. Ne URI ne de MIME türü içeren bir intent, yalnızca filtre herhangi bir URI veya MIME türü belirtmediği takdirde testi geçer.
  2. URI içeren ancak MIME türü içermeyen (URI'den açıkça anlaşılamayan veya çıkarılamayan) bir intent, yalnızca URI'si filtrenin URI biçimiyle eşleştiğinde ve filtre de MIME türü belirtmediğinde testi geçer.
  3. MIME türü içeren ancak URI içermeyen bir intent, yalnızca filtre aynı MIME türünü listelediğinde ve URI biçimi belirtmediğinde 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 tür filtrede listelenen bir türle eşleşirse geçer. URI'sının filtredeki bir URI ile eşleşmesi veya content: ya da file: URI'sine sahip olması ve filtrenin bir URI belirtmemesi halinde, testin URI bölümünü geçer. Diğer bir deyişle, filtresinde yalnızca bir MIME türü listelenen bir bileşenin content: ve file: verilerini desteklediği varsayılır.

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

Son kural olan (d) kuralı, bileşenlerin bir dosyadan 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 söylediği tipik bir durum gösterilmektedir:

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

Mevcut verilerin çoğu içerik sağlayıcılar tarafından dağıtıldığı için URI belirtmeyen ancak veri türünü belirten filtreler belki de en yaygın olanlardır.

Şema ve veri türü içeren filtreler de yaygın olarak kullanılır. Ö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ştirme

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

Uygulamanız, Home uygulamasına benzer şekilde intent eşleştirmeyi kullanabilir. PackageManager, belirli bir amacı kabul edebilecek tüm bileşenleri döndüren bir dizi query...() yöntemine ve bir amaca yanıt vermek için en iyi bileşeni belirleyen benzer bir resolve...() yöntem dizisine sahiptir. Örneğin, queryIntentActivities() bağımsız değişken olarak iletilen intent'i gerçekleştirebilen tüm etkinliklerin listesini döndürür ve queryIntentServices() benzer bir hizmet listesini döndürür. Hiçbir yöntem bileşenleri etkinleştirmez. Yalnızca yanıt verebilecek olanları listeler. Yayın alıcıları için benzer bir yöntem de vardır (queryBroadcastReceivers()).