Niyetler ve niyet filtreleri

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

  • Etkinlik başlatma

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

    Tamamlandığında etkinlikten bir sonuç almak istiyorsanız startActivityForResult() işlevini çağırın. Etkinliğiniz, sonucu etkinliğinizin onActivityResult() geri çağırmasında ayrı bir Intent nesnesi olarak alır. Daha fazla bilgi için Etkinlikler rehberine 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 hizmet başlatabilirsiniz. JobScheduler hakkında daha fazla bilgi için API-reference documentation öğesine göz atın.

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

    Hizmet bir istemci-sunucu arayüzüyle tasarlanmışsa bindService() öğesine Intent ileterek başka bir bileşenden hizmete bağlayabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzuna bakın.

  • Yayın yapma

    Anons, tüm uygulamaların alabileceği mesajdır. Sistem, sistemin başlatılması veya cihazın şarj olmaya başlaması gibi sistem etkinlikleri için çeşitli yayınlar sunar. sendBroadcast() veya sendOrderedBroadcast() cihazına 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 konularına bakın.

Amaç türleri

İki tür amaç vardır:

  • Belirgin amaçlar, tam ComponentName belirterek hangi uygulamanın amacı yerine getireceğini belirtir. Başlamak 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ı niyetler, belirli bir bileşeni adlandırmaz ancak bunun yerine, başka bir uygulamadaki bileşenin onu işlemesine olanak tanıyan genel bir işlem bildirir. Örneğin, kullanıcıya harita üzerinde bir konum göstermek istiyorsanız örtülü bir intent kullanarak başka bir uygulamanın haritada belirli bir konumu göstermesini isteyebilirsiniz.

Şekil 1'de, etkinlik başlatılırken amacın 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 etkinlik başlatmak için örtülü bir niyetin sistem üzerinden nasıl sağlandığı: [1] A Etkinliği, işlem açıklaması içeren bir Intent oluşturur ve bunu startActivity() öğesine iletir. [2] Android Sistemi, amaçla eşleşen bir intent filtresi bulmak için tüm uygulamalarda arama yapar. Bir eşleşme bulunduğunda [3] sistem, onCreate() yöntemini çağırıp Intent öğesini ileterek eşleşme etkinliğini (B Etkinliği) başlatır.

Dolaylı bir intent kullandığınızda Android sistemi, amacın içeriğini cihazdaki diğer uygulamaların manifest dosyasında tanımlanan 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 yayınlar. Birden fazla intent filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebileceği bir iletişim kutusu gösterir.

Intent filtresi, bir uygulamanın manifest dosyasında bulunan ve bileşenin almak istediği amaçların türünü 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 olduğundan emin olmak için Service başlatırken her zaman açık bir amaç kullanın ve hizmetleriniz için amaç filtreleri beyan etmeyin. Bir hizmeti başlatmak için örtülü niyet kullanmak, güvenlik açısından tehlike arz eder. Çünkü amaca yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başladığını göremez. Android 5.0 (API düzeyi 21) sürümünden itibaren, bindService() öğesini örtülü bir niyetle ç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ığı bilgilerin (amacı alması gereken tam bileşen adı veya bileşen kategorisi gibi) yanı sıra, alıcı bileşenin işlemi düzgün bir şekilde gerçekleştirmek için kullandığı bilgileri (yapılacak işlem ve üzerinde işlem yapılacak veriler gibi) taşır.

Intent iç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 hale getiren önemli bir bilgidir. Diğer bir deyişle, amacın yalnızca bileşen adıyla tanımlanan uygulama bileşenine iletilmesi gerekir. Bileşen adı olmadığında amaç dolaylı olur ve sistem, diğer amaç bilgilerine (aşağıda açıklanan işlem, veri ve kategori gibi) dayanarak niyeti hangi bileşenin alacağına karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmelisiniz.

Not: Service öğesini başlatı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ı da dahil olmak üzere (com.example.ExampleActivity gibi) hedef bileşenin tam nitelikli sınıf adını kullanarak belirtebileceğiniz bir ComponentName nesnesidir. Bileşen adını setComponent(), setClass(), setClassName() veya Intent oluşturucuyla ayarlayabilirsiniz.

İşlem
Gerçekleştirilecek genel işlemi belirten bir dize (ör. görüntüleme veya seç).

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

Uygulamanızdaki amaçlar 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 sabitleri belirtebilirsiniz. Bir etkinlik 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ı bilgilere (ör. galeri uygulamasında görüntülenecek bir fotoğraf veya harita uygulamasında görüntülenecek bir adres) sahip olduğunuzda bu işlemi startActivity() ile niyette kullanın.
ACTION_SEND
Paylaşım amacı olarak da bilinen bu özelliği, 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 niyette kullanmalısınız.

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 yerinde (ör. sistemin Ayarlar uygulamasında belirli ekranları açan işlemler için Settings içinde) 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ı bir ö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 (bir Uri nesnesi) ve/veya bu verilerin MIME türü. Sağlanan verilerin türü genellikle niyetin işlemine göre belirlenir. Örneğin, işlem ACTION_EDIT ise veriler düzenlenecek dokümanın URI'sını içermelidir.

Bir amaç oluştururken, URI'ya ek olarak veri türünü (MIME türü) belirtmek genellikle önemlidir. Örneğin, URI biçimleri benzer olsa bile, resimleri görüntüleyebilen bir etkinlik muhtemelen ses dosyası çalamaz. Verilerinizin MIME türünü belirtmeniz, Android sisteminin amacınızı alacak en iyi bileşeni bulmasına yardımcı olur. Ancak, özellikle de veriler bir content: URI'si olduğunda, MIME türü bazen URI'den çıkarılabilir. content: URI, verilerin cihazda bulunduğunu ve veri MIME türünü sisteme görünür hale getiren bir ContentProvider tarafından kontrol edildiğini gösterir.

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 her ikisini de setDataAndType() ile açıkça ayarlayabilirsiniz.

Dikkat: Hem URI hem de MIME türünü ayarlamak istiyorsanız her biri diğerinin değerini geçersiz kılacağından setData() ve setType() çağrılarını yapmayın. Hem URI hem de MIME türünü ayarlamak için her zaman setDataAndType() kullanın.

Kategori
Amacı işlemesi gereken bileşenin türü hakkında ek bilgileri içeren bir dize. Amaca istediğiniz kadar kategori açıklaması yerleştirilebilir, ancak çoğu amaç bir kategori gerektirmez. Sık karşılaşılan kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE
Hedef etkinlik, bir bağlantının başvurduğu resim veya e-posta mesajı gibi verilerin görüntülenmesi 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 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 niyet, uygulama bileşenine çözümlenme şeklini etkilemeyen ek bilgiler içerebilir. Niyet, 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ı eylemler belirli türde veri URI'ları kullandığı gibi, bazı işlemler de belirli ekstraları kullanır.

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

Örneğin, ACTION_SEND ile e-posta göndermek için niyet oluştururken Alıcı alıcısını EXTRA_EMAIL anahtarıyla, konuyu 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ı 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 ayrıştırılmış veya serileştirilmiş sınıfa erişimi yoksa sistem bir RuntimeException oluşturur.

İşaretler
İşaretler, Intent sınıfında tanımlanmış ve amaç için meta veri işlevi görür. İşaretler, Android sistemine bir etkinliğin nasıl başlatılacağını (örneğin, etkinliğin hangi göreve ait olması gerektiği) ve başlatıldıktan sonra nasıl işleneceğini (örneğin, son etkinlikler listesinde olup olmadığı) yollayabilir.

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

Uygunsuz amaç ö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 şu 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. Dolayısıyla bu amaç, uygulamada açıkça DownloadService sınıfını 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, cihazdaki herhangi bir uygulamayı çağırabilen işlemi belirtir. Dolaylı intent, uygulamanız işlemi gerçekleştiremediğinde faydalıdır, ancak diğer uygulamalar muhtemelen bunu yapabiliyor ve kullanıcının hangi uygulamayı kullanacağını seçmesini istiyorsanız.

Ö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 amaçla startActivity() uygulamasını aradığınızda kullanıcı, içeriği paylaşacağı 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 hangi uygulamaların bu tür bir niyeti (ACTION_SEND işlemi içeren ve "metin/düz" verileri taşıyan niyet) işleyebildiğini belirlemek için tüm yüklü uygulamaları inceler. Bunu işleyebilecek yalnızca bir uygulama varsa o uygulama hemen açılır ve kendisine niyeti verilir. Başka hiçbir uygulama bunu işleyemezse uygulamanız gerçekleşen ActivityNotFoundException aktarmasını 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. 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 uygulamanın kullanılacağını seçebilir ve o 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() öğesine 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ı tespit edin

Uygulamanız, uygulamanızdaki bileşenler arasında gezinmek veya başka bir uygulama adına işlem gerçekleştirmek için niyetler başlatabilir. Android 12 (API düzeyi 31) ve sonraki sürümler, uygulamanızda güvenli olmayan bir amaç başlatma işlemi gerçekleştirirse sizi uyaran bir hata ayıklama özelliği sunarak platform güvenliğini iyileştirebilir. Örneğin, uygulamanız iç içe yerleştirilmiş bir niyetin güvenli olmayan bir şekilde başlatılmasını gerçekleştirebilir. Bu, başka bir amaçta fazladan olarak aktarılan bir amaçtır.

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, iç içe yerleştirilmiş amacı kullanarak amacı hemen startActivity(), startService() veya bindService() öğesine iletme gibi bir uygulama bileşeni başlatır.

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 olup olmadığını kontrol etme

Uygulamanızda güvenli olmayan intent başlatma 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 bir StrictMode ihlali algılarsa, hassas olabilecek 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 kullanın

Güvenli olmayan intent başlatma ve StrictMode ihlali ihtimalini en aza indirmek için bu en iyi uygulamaları izleyin.

Amaçlardaki yalnızca önemli ekstraları kopyalayın ve gerekli tüm sağlık ve doğrulama işlemlerini yapın. Uygulamanız, ekstraları bir amaçtan, yeni bir bileşeni başlatmak için kullanılan başka bir amaca kopyalayabilir. Bu işlem, uygulamanız putExtras(Intent) veya putExtras(Bundle) çağırdığında gerçekleşir. Uygulamanız bu işlemlerden birini gerçekleştirirse yalnızca alıcı bileşenin 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ı temizleyip doğrulayın.

Uygulamanızın bileşenlerini gereksiz yere dışa aktarmayın. Örneğin, iç içe yerleştirilmiş bir 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 şekilde, başka bir uygulama, Intent içeren PendingIntent öğesini ayrıştırdığında, diğer uygulama uygulamanızın kimliğini kullanarak PendingIntent öğesini başlatabilir. Bu yapılandırma, diğer uygulamanın uygulamanızda, dışa aktarılmayan bileşenler de dahil olmak üzere herhangi bir bileşeni 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 sizin uygulamanıza nasıl geri gönderdiği gösterilmektedir:

  1. Uygulamanız, başka bir uygulamadaki etkinliği çağıran bir intent oluşturuyor. Bu niyete ekstra olarak bir PendingIntent nesnesi eklersiniz. Bu beklemedeki amaç, uygulamanızdaki 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ü uygulamanıza geri ilettikten sonra sistem, uygulamanızın bağlamını kullanarak beklemedeki niyeti çağırır.

Şekil 2. İç içe bekleyen bir amaç kullanılırken uygulamalar arası iletişim şeması.

Dolaylı intent alma

Uygulamanızın hangi örtülü amaçları alabileceğinin reklamını yapmak için manifest dosyanızda uygulama bileşenlerinizin her biri için bir veya daha fazla intent filtresi <intent-filter> öğesi ile bildirin. 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 birini geçebilmesi durumunda uygulama bileşeninize örtülü bir intent sunar.

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

Bir uygulama bileşeni, yapabileceği her benzersiz iş için ayrı filtreler beyan etmelidir. Örneğin, bir resim galerisi uygulamasındaki bir etkinliğin iki filtresi olabilir: Bir resmi görüntülemek için filtre, resmi düzenlemek için başka bir filtre. Etkinlik başladığında Intent öğesini inceler ve Intent içindeki bilgilere dayanarak nasıl davranılacağına (düzenleyici kontrollerini gösterip göstermeme gibi) karar verir.

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

<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ın erişip erişemeyeceğini 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, şu üç öğeden birini veya daha fazlasını kullanarak kabul edilecek niyet türlerini belirtebilirsiniz:

<action>
Kabul edilen intent işlemini name özelliğinde 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>
Kabul edilen amaç kategorisini name özelliğinde belirtir. Değer, sınıf sabiti değil, işlemin düz dize değeri olmalıdır.

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

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

Birden fazla <action>, <data> veya <category> ö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, amacı 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 çözümlediği hakkında daha fazla bilgi için aşağıdaki Amaç Çözümü bölümüne bakın.

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. Bileşenlerinizden birini yalnızca kendi uygulamanızın başlatabilmesi önemliyse manifest dosyanızda amaç filtrelerini bildirmeyin. Bunun yerine, bileşen için exported özelliğini "false" olarak ayarlayın.

Benzer şekilde, yanlışlıkla farklı bir uygulamanın Service öğesini çalıştırmamak 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 bildirmeniz gerekir. Ancak yayın alıcıları için filtreler, registerReceiver() çağrısı yapılarak dinamik olarak kaydedilebilir. Ardından, alıcının unregisterReceiver() kaydını iptal edebilirsiniz. Bu sayede uygulamanız, uygulamanız çalışırken yalnızca belirli bir süre boyunca belirli yayınları dinleyebilir.

Örnek filtreler

Amaç filtresi davranışlarından bazılarını göstermek için bir sosyal paylaşım uygulamasının manifest 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 (MainActivity), uygulamanın ana giriş noktasıdır. Kullanıcı, uygulamayı başlatıcı simgesiyle ilk kez başlattığında açılan etkinlik:

  • ACTION_MAIN işlemi, bunun ana giriş noktası olduğunu belirtir ve herhangi bir intent verisi beklemez.
  • CATEGORY_LAUNCHER kategorisi, bu etkinlik simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini belirtir. <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 birbiriyle eşlenmesi gerekir.

İkinci etkinlik olan ShareActivity'ın amacı, metin ve medya içeriğinin paylaşımını kolaylaştırmaktır. 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: MIME türü (application/vnd.google.panorama360+jpg), Google panorama API'leri ile işleyebileceğiniz panorama fotoğrafları belirten özel bir veri türüdür.

Amaçları 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ı işlemelidir.

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 bir <intent-filter> öğesinin işlemleri ve kategorileriyle eşleşmesi durumunda 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:

  • Herhangi bir intent filtresi bildirmeyen bileşenlere yayınlanan intentler.
  • Kaynağı aynı uygulama içinde olan amaçlar.
  • Sistemden gelen, 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 intent kullanma

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

Beklemedeki amaçların başlıca kullanım alanları şunlardır:

  • Kullanıcı, Bildiriminiz ile ilgili bir işlem gerçekleştirdiğinde yürütülecek bir niyetin bildirilmesi (Android sisteminin NotificationManager özelliği Intent öğesini yürütür).
  • Kullanıcı, Uygulama Widget'ınızla (Ana ekran uygulaması Intent öğesini yürütür) bir işlem gerçekleştirdiğinde yürütülecek bir niyetin tanımlanması.
  • Gelecekteki bir zamanda yürütülecek bir niyetin bildirilmesi (Android sisteminin AlarmManager özelliği, Intent komutunu yürütür).

Her Intent nesnesi gibi belirli bir uygulama bileşeni türü (Activity, Service veya BroadcastReceiver) tarafından işlenmek üzere tasarlandığı gibi, PendingIntent için de aynı dikkat edilecek şekilde oluşturulmalıdır. Beklemedeki bir amaç kullanılırken uygulamanız, amacı 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 amaçları almadığı sürece, PendingIntent oluşturmak için yukarıda açıklanan yöntemler muhtemelen ihtiyacınız olan tek yöntem olacaktır.PendingIntent

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

Beklemedeki amaçları kullanma hakkında daha fazla bilgi edinmek için Bildirimler ve Uygulama Widget'ları API kılavuzları gibi ilgili kullanım alanlarının her birine ait dokümanlara bakın.

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ş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şaretlerinin ikisini de ayarlamadan bir 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 değiştirilemez beklemedeki 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 belirli kullanım alanları bunun yerine değişebilir PendingIntent nesneleri gerektirir:

  • Bildirimlerde doğrudan yanıt işlemlerini destekleme. Doğrudan yanıt, yanıtla ilişkili 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 örnekleri kullanılarak bildirimler Android Auto çerçevesiyle ilişkilendiriliyor.
  • Görüşmeler, PendingIntent örnekleri kullanılarak baloncuklara 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 bilgisi isteme. Değişebilir 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şebilir PendingIntent nesnesi, sistemin EXTRA_ALARM_COUNT amacını ekstra eklemesine olanak tanır. Bu ekstra değer, tekrarlanan bir alarmın kaç kez tetiklendiğini gösterir. Bu ekstra içeriği içerdiğinden amaç, tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediğini (örneğin, cihazın uyku modundayken) uygulamaya doğru bir şekilde bilgi verebilir.

Uygulamanız değişebilir bir PendingIntent nesnesi oluşturuyorsa açık amaç kullanmanız ve ComponentName doldurmanız önerilir. Böylece başka bir uygulama PendingIntent işlevini çağırıp kontrolü uygulamanıza geri verdiğinde, uygulamanızda her zaman aynı bileşen başlar.

Beklemedeki amaçlar içinde açık intentler kullanın

Diğer uygulamaların, uygulamanızın beklemedeki amaçlarını nasıl kullanabileceğini daha iyi tanımlamak için beklemedeki bir niyeti her zaman açık amacın 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 (API düzeyi 23) sürümüne eklenen FLAG_IMMUTABLE'ı 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ümü

Sistem bir etkinlik başlatmak için örtülü bir niyet aldığında, üç unsura göre intent filtreleriyle karşılaştırarak amaç için en iyi etkinliği arar:

  • İşlem.
  • Veri (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.

Aksiyon 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 filtreyi geçmek için Intent ile belirtilen işlem, filtrede listelenen işlemlerden biriyle eşleşmelidir.

Filtre herhangi bir işlemi listelemezse niyetin eşleştireceği bir şey olmaz. Bu nedenle, tüm amaçlar 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 amaç kategorilerini belirtmek için intent filtreleri 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>

Amacın kategori testini geçmek için Intent içindeki her kategorinin filtredeki bir kategoriyle eşleşmesi gerekir. Bunun tersi gerekmez. Amaç filtresi, Intent özelliğinde belirtilenden daha fazla kategori bildirebilir ve Intent yine de başarılı olur. Bu nedenle, kategorisi olmayan bir amaç, filtrede tanımlanan kategorilerden bağımsız olarak bu testi her zaman geçer.

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

Veri testi

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

<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'nın her bölümü ayrı bir özelliktir: scheme, host, port ve path:

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

Aşağıdaki örnekte, bu özelliklere ilişkin 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.

<data> öğesinde bu özelliklerin her biri 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ı 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 filtreye dahil edilen URI bölümleriyle karşılaştırılır. Örnek:

  • Filtre yalnızca bir şema belirtiyorsa bu şemaya sahip tüm URI'lar filtreyle eşleşir.
  • Bir filtre bir şema ve yetkili belirtiyor ancak yol belirtmiyorsa aynı şema ve yetkiye sahip tüm URI'ler, yollarına bakılmaksızın filtreden geçer.
  • Filtre bir şema, yetkili ve yol belirtiyorsa yalnızca aynı şema, yetkili ve yola sahip URI'lar filtreden geçer.

Not: Yol spesifikasyonu, yol adının yalnızca kısmi eşleşmesini zorunlu kılmak için yıldız joker karakteri (*) 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. URI veya MIME türü içermeyen bir intent, yalnızca filtre herhangi bir URI veya MIME türü belirtmediğinde testi geçer.
  2. URI içeren ancak MIME türü olmayan (açık veya URI'dan anlaşılamayan) bir intent, yalnızca URI'si filtrenin URI biçimiyle eşleşiyorsa ve filtre de bir MIME türü belirtmiyorsa testi geçer.
  3. MIME türü içeren ancak URI olmayan bir intent, yalnızca filtrenin aynı MIME türünü listelediği ve bir URI biçimi belirtmiyorsa testi geçer.
  4. Hem URI hem de MIME türü (açık veya URI'dan anlaşılabilir) içeren bir intent, yalnızca bu tür filtrede listelenen bir türle eşleşirse testin MIME türü bölümünü 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. Başka bir deyişle, bir bileşenin filtresi yalnızca bir MIME türünü listeliyorsa bileşenin content: ve file: verilerini desteklediği varsayılır.

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

Bu son kural, (d) kuralı, bileşenlerin bir dosya veya içerik sağlayıcıdan yerel veriler alabilmeleri 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 bunu gösterebileceğini bildirdiği tipik bir durum gösterilmektedir:

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

Kullanılabilir verilerin çoğu içerik sağlayıcılar tarafından dağıtıldığından, bir veri türünü belirten ancak URI olmayan filtreler muhtemelen en yaygın olanlardır.

Yaygın olarak kullanılan diğer bir 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>

Amaç eşleştirme

Intent'ler, etkinleştirilecek hedef bileşeni ve cihazdaki bileşen grubu hakkında bir şeyler keşfetmek için intent filtreleriyle eşleştirilir. Örneğin Home uygulaması, ACTION_MAIN işlemini ve CATEGORY_LAUNCHER kategorisini belirten intent filtreleriyle tüm etkinlikleri bularak uygulama başlatıcıyı doldurur. Eşleme, yalnızca Amaç'taki eylemler ve kategorilerin IntentFilter sınıfı belgelerinde açıklandığı gibi filtreyle eşleşmesi durumunda 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 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 amacı 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 verebilecekleri listeler. Yayın alıcıları için de queryBroadcastReceivers() gibi bir yöntem vardır.