Intent, başka bir uygulama bileşeninden işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir.
Intent'ler, bileşenler arasındaki iletişimi çeşitli şekillerde kolaylaştırsa da üç temel kullanım alanı vardır:
- Etkinlik başlatma
Activity, bir uygulamadaki tek bir ekranı temsil eder.IntentöğesinistartActivity()öğesine ileterek yeni birActivityörneği başlatabilirsiniz.Intent, başlatılacak etkinliği tanımlar ve gerekli tüm verileri taşır.Etkinlik tamamlandığında sonuç almak istiyorsanız
startActivityForResult()numaralı telefonu arayın. Etkinliğiniz, sonucu etkinliğinizinonActivityResult()geri çağırma işlevinde ayrı birIntentnesnesi 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şlemler gerçekleştiren bir bileşendir. Android 5.0 (API düzeyi 21) ve sonraki sürümlerde,JobSchedulerile bir hizmet başlatabilirsiniz.JobSchedulerhakkında daha fazla bilgi içinAPI-reference documentationbölümüne bakın.Android 5.0'dan (API düzeyi 21) önceki sürümlerde
Servicesınıfının yöntemlerini kullanarak bir hizmet başlatabilirsiniz.IntentöğesinistartService()öğesine ileterek tek seferlik bir işlem (ör. dosya indirme) gerçekleştirmek için hizmet başlatabilirsiniz.Intent, başlatılacak hizmeti açıklar ve gerekli verileri taşır.Hizmet, istemci-sunucu arayüzüyle tasarlanmışsa
IntentöğesinibindService()öğesine ileterek başka bir bileşenden hizmete bağlanabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzuna bakın. - Yayın yapma
Yayın, herhangi bir uygulamanın alabileceği bir mesajdır. Sistem, sistem başlatıldığında veya cihaz şarj olmaya başladığında olduğu gibi sistem etkinlikleri için çeşitli yayınlar sunar.
IntentöğesinisendBroadcast()veyasendOrderedBroadcast()'ye ileterek diğer uygulamalara yayın yapabilirsiniz.
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 başlıklı makaleleri inceleyin.
Amaç türleri
İki tür amaç vardır:
- Açık amaçlar, tam bir
ComponentNamebelirterek hangi uygulamanın hangi bileşeninin amacı karşılayacağını belirtir. Genellikle kendi uygulamanızdaki bir bileşeni başlatmak için belirgin intent kullanırsınız. Bunun nedeni, başlatmak istediğiniz etkinliğin veya hizmetin sınıf adını bilmenizdir. Ö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 gerçekleştirilecek genel bir işlem bildirir. Bu, başka bir uygulamadaki bir bileşenin işlemi gerçekleştirmesine olanak tanır. Örneğin, kullanıcıya haritada bir konum göstermek istiyorsanız başka bir uygun uygulamanın haritada belirtilen konumu göstermesini istemek için dolaylı intent kullanabilirsiniz.
Şekil 1'de, bir 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 etkinliği başlatmak için sistem üzerinden nasıl örtülü bir amaç iletilir: [1] A Etkinliği, bir işlem açıklaması içeren bir Intent oluşturur ve bunu startActivity()'a iletir. [2] Android sistemi, tüm uygulamalarda intent ile eşleşen bir intent filtresi arar. Eşleşme bulunduğunda [3] sistem, onCreate() yöntemini çağırıp Intent değerini ileterek eşleştirme etkinliğini (Etkinlik B) başlatır.
Örtülü bir amaç kullandığınızda Android sistemi, amacı başlatmak için uygun bileşeni bulur. Bunu yaparken amacın içeriğini cihazdaki diğer uygulamaların manifest dosyasında belirtilen amaç filtreleriyle karşılaştırır. Amaç, bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve Intent nesnesini teslim eder. Birden fazla amaç filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebilmesi için bir iletişim kutusu gösterir.
Intent filtresi, bir uygulamanın manifest dosyasında bileşenin almak istediği intent türünü belirten bir ifadedir. Örneğin, bir etkinlik için intent filtresi bildirerek diğer uygulamaların etkinliğinizi belirli bir intent türüyle doğrudan başlatmasını sağlayabilirsiniz. Benzer şekilde, bir etkinlik için herhangi bir amaç filtresi bildirmezseniz bu 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 belirgin intent kullanın ve hizmetleriniz için intent filtreleri tanımlamayın. Bir hizmeti başlatmak için dolaylı intent kullanmak güvenlik açısından tehlikelidir. Çünkü hangi hizmetin intent'e yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başlatıldığını göremez. Android 5.0'dan (API düzeyi 21) itibaren, bindService() işlevini dolaylı intent ile çağırdığınızda sistem istisna oluşturur.
Amaç oluşturma
Bir Intent nesnesi, Android sisteminin hangi bileşenin başlatılacağını belirlemek için kullandığı bilgileri (ör. tam bileşen adı veya amaç alması gereken bileşen kategorisi) ve alıcı bileşenin işlemi düzgün şekilde gerçekleştirmek için kullandığı bilgileri (ör. yapılacak işlem ve üzerinde işlem yapılacak veriler) içerir.
Bir 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 amaca açık anlam kazandıran kritik bilgidir. Bu, amacın yalnızca bileşen adıyla tanımlanan uygulama bileşenine iletilmesi gerektiği anlamına gelir. Bileşen adı olmadan amaç örtülüdür ve sistem, diğer amaç bilgilerine (ör. aşağıda açıklanan işlem, veri ve kategori) göre hangi bileşenin amacı alması gerektiğine karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmeniz gerekir.
Not:
Servicebaşlatırken bileşen adını her zaman 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ı, hedef bileşenin tam nitelikli sınıf adı kullanılarak belirtilebilen birComponentNamenesnesidir. Buna uygulamanın paket adı da dahildir. Örneğin,com.example.ExampleActivity. Bileşen adınısetComponent(),setClass(),setClassName()veyaIntentoluşturucusuyla ayarlayabilirsiniz. - İşlem
- Gerçekleştirilecek genel işlemi (ör. görüntüleme veya seçme) belirten bir dize.
Yayın amaçlı bir durumda, bu işlem gerçekleşmiş ve raporlanmaktadır. İşlem, niyetin geri kalanının nasıl yapılandırılacağını büyük ölçüde belirler. Özellikle de verilerde ve ekstralarda yer alan bilgileri.
Uygulamanızdaki amaçlar tarafından kullanılmak üzere (veya uygulamanızdaki bileşenleri çağırmak için diğer uygulamalar tarafından kullanılmak üzere) kendi işlemlerinizi belirtebilirsiniz ancak genellikle
Intentsınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitlerini belirtirsiniz. Aktivite başlatmak için yaygın olarak kullanılan işlemlerden bazıları şunlardır:ACTION_VIEW- Bu işlemi, bir etkinliğin kullanıcıya gösterebileceği bazı bilgileriniz olduğunda
startActivity()içeren bir amaçla kullanın. Örneğin, galeri uygulamasında görüntülenecek bir fotoğraf veya harita uygulamasında görüntülenecek bir adres. ACTION_SEND- Paylaşma amacı olarak da bilinir. Kullanıcının başka bir uygulama (ör. e-posta uygulaması veya sosyal paylaşım uygulaması) üzerinden paylaşabileceği verileriniz olduğunda bu amacı
startActivity()ile birlikte kullanmanız gerekir.
Genel işlemleri tanımlayan daha fazla sabit için
Intentsınıf referansına bakın. Diğer işlemler, Android çerçevesinin başka yerlerinde tanımlanır. Örneğin, sistemin Ayarlar uygulamasında belirli ekranları açan işlemler içinSettingskullanılır.Bir niyetin işlemini
setAction()veyaIntentoluşturucusuyla belirtebilirsiniz.Kendi işlemlerinizi tanımlıyorsanı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 referans veren URI (bir
Urinesnesi) ve/veya bu verilerin MIME türü. Sağlanan veri türü genellikle amaçlanan işleme göre belirlenir. Örneğin, işlemACTION_EDITise veriler, düzenlenecek dokümanın URI'sini içermelidir.Bir amaç oluştururken URI'sinin yanı sıra veri türünü (MIME türü) de belirtmek genellikle önemlidir. Örneğin, URI biçimleri benzer olsa da resim görüntüleyebilen bir etkinlik, ses dosyası çalamayabilir. Verilerinizin MIME türünü belirtmek, Android sisteminin amacınızı alacak en iyi bileşeni bulmasına yardımcı olur. Ancak, MIME türü bazen URI'den çıkarılabilir. Bu durum özellikle veriler
content:URI'si olduğunda geçerlidir.content:URI, verilerin cihazda bulunduğunu veContentProvidertarafından kontrol edildiğini gösterir. Bu da verilerin MIME türünü sistem için 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çinsetType()işlevini çağırın. Gerekirse her ikisini desetDataAndType()ile açıkça ayarlayabilirsiniz.Dikkat: Hem URI'yi hem de MIME türünü ayarlamak istiyorsanız
setData()vesetType()işlevlerini çağırmayın. Bu işlevler, birbirlerinin değerini geçersiz kılar. Hem URI hem de MIME türünü ayarlamak için her zamansetDataAndType()kullanın. - Kategori
- Amacı işleyecek 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.
Yaygın kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE- Hedef etkinlik, bir bağlantı tarafından referans verilen verileri (ör. resim veya e-posta mesajı) görüntülemek için bir web tarayıcısı tarafından başlatılmasına izin veriyor.
CATEGORY_LAUNCHER- Etkinlik, bir görevin ilk etkinliğidir ve sistemin uygulama başlatıcısında listelenir.
Kategorilerin tam listesi için
Intentsınıf açıklamasını inceleyin.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 belirleyebilir. Ancak bir amaç, uygulama bileşenine nasıl çözüldüğünü etkilemeyen ek bilgiler taşıyabilir. Bir amaç aşağıdaki bilgileri de sağlayabilir:
- Ekstralar
- İstenen işlemin gerçekleştirilmesi için gereken ek bilgileri içeren anahtar/değer çiftleri.
Bazı işlemler belirli veri URI'lerini kullanırken bazı işlemler de belirli ekstraları kullanır.
Çeşitli
putExtra()yöntemlerle ek veriler ekleyebilirsiniz. Bu yöntemlerin her biri iki parametre kabul eder: anahtar adı ve değer. Ayrıca, tüm ek verileri içeren birBundlenesnesi oluşturabilir, ardındanBundlenesnesiniIntentiçineputExtras()ile ekleyebilirsiniz.Örneğin,
ACTION_SENDile e-posta gönderme niyeti oluştururkenEXTRA_EMAILanahtarıyla alıcıyı,EXTRA_SUBJECTanahtarıyla da konuyu belirtebilirsiniz.Intentsınıfı, standartlaştırılmış veri türleri için birçokEXTRA_*sabiti belirtir. Kendi ek anahtarlarınızı (uygulamanızın aldığı intent'ler için) tanımlamanız gerekiyorsa aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını ön ek olarak eklediğinizden emin olun:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Dikkat: Başka bir uygulamanın almasını beklediğiniz bir amaç gönderirken
ParcelableveyaSerializableverilerini kullanmayın. Bir uygulama,Bundlenesnesindeki verilere erişmeye çalışırsa ancak paketlenmiş veya serileştirilmiş sınıfa erişimi yoksa sistemRuntimeExceptionoluşturur. - İşaretler
- İşlemin meta verileri olarak işlev gören
Intentsınıfında tanımlanır. Bu işaretler, Android sistemine bir etkinliğin nasıl başlatılacağı (örneğin, etkinliğin hangi göreve ait olması gerektiği) ve başlatıldıktan sonra nasıl ele alınacağı (örneğin, son etkinlikler listesinde yer alıp almayacağı) konusunda talimat verebilir.Daha fazla bilgi için
setFlags()yöntemine bakın.
Belirgin intent ö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 DownloadService adlı bir hizmet oluşturduysanız ve bu hizmet web'den dosya indirmek için tasarlanmışsa aşağıdaki kodla başlatabilirsiniz:
Kotlin
// Executed in an Activity, so 'this' is theContext// 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 theContext// The fileUrl is a string URL, such as "http://www.example.com/image.png" Intent downloadIntent = new Intent(this, DownloadService.class); downloadIntent.setData(Uri.parse(fileUrl)); startService(downloadIntent);
Intent(Context, Class)
oluşturucusu, uygulamaya Context ve bileşene 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.
Örnek dolaylı intent
Dolaylı intent, cihazda işlemi gerçekleştirebilen herhangi bir uygulamayı çağırabilecek bir işlemi belirtir. Uygulamanız işlemi gerçekleştiremediğinde ancak diğer uygulamalar gerçekleştirebildiğinde ve kullanıcının hangi uygulamayı kullanacağını seçmesini istediğinizde dolaylı intent kullanmak yararlıdır.
Örneğin, kullanıcının başkalarıyla 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 ekstralar ekleyin. Bu amaçla startActivity() işlevini çağırdığınızda kullanıcı, içeriği paylaşmak için bir uygulama seçebilir.
Kotlin
// Create the text message with a string. val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Try to invoke the intent. try { startActivity(sendIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
startActivity() çağrıldığında sistem, bu tür bir amaç isteğini (ACTION_SEND işlemiyle ve "text/plain" verilerini taşıyan bir amaç isteği) işleyebilecek yüklü uygulamaları inceler. İsteği işleyebilen tek bir uygulama varsa bu uygulama hemen açılır ve amaç verilir. Başka hiçbir uygulama bu durumu işleyemiyorsa uygulamanız, meydana gelen ActivityNotFoundException durumunu yakalayabilir. Birden fazla etkinlik, amaç isteğini kabul ederse sistem, Şekil 2'de gösterilene benzer bir iletişim kutusu gösterir. Böylece kullanıcı, hangi uygulamayı kullanacağını seçebilir.
Diğer uygulamaları başlatma hakkında daha fazla bilgi için kullanıcıyı başka bir uygulamaya yönlendirme hakkındaki kılavuza bakın.
Şekil 2. Bir seçici iletişim kutusu.
Uygulama seçiciyi zorunlu kılma
Dolaylı intentinize 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çenek haline getirebilir. Varsayılan seçme özelliği, kullanıcının muhtemelen her seferinde aynı uygulamayı kullanmak istediği bir işlemi (ör. web sayfası açma) gerçekleştirirken faydalıdır (kullanıcılar genellikle tek bir web tarayıcısı kullanmayı tercih eder).
Ancak birden fazla uygulama, amaca yanıt verebiliyorsa ve kullanıcı her seferinde farklı bir uygulama kullanmak isteyebiliyorsa seçici iletişim kutusunu açıkça 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şlemiyle "paylaşma" gerçekleştirdiğinde kullanıcılar, mevcut durumlarına bağlı olarak farklı bir uygulamayı kullanarak paylaşmak isteyebilir. Bu nedenle, Şekil 2'de gösterildiği gibi her zaman seçici iletişim kutusunu kullanmanız gerekir.
Seçiciyi göstermek için createChooser() kullanarak bir Intent oluşturun ve aşağıdaki örnekte gösterildiği gibi startActivity()'ye iletin.
Bu örnekte, createChooser() yöntemine iletilen amaca yanıt veren uygulamaların listesini içeren bir iletişim kutusu gösterilir ve sağlanan metin iletişim kutusu başlığı olarak kullanılır.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) ... // Always use string resources for UI text. // This says something like "Share this photo with" val title: String = resources.getString(R.string.chooser_title) // Create intent to show the chooser dialog val chooser: Intent = Intent.createChooser(sendIntent, title) // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(chooser) }
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
Güvenli olmayan intent başlatma işlemlerini algılama
Uygulamanız, kendi içindeki bileşenler arasında gezinmek veya başka bir uygulama adına işlem gerçekleştirmek için intent başlatabilir. Android 12 (API düzeyi 31) ve sonraki sürümlerde, platform güvenliğini artırmak için uygulamanızın intent'i güvenli olmayan şekilde başlatması durumunda sizi uyaran bir hata ayıklama özelliği bulunur. Örneğin, uygulamanız başka bir amaçta ek olarak iletilen bir amaç olan iç içe yerleştirilmiş bir amacı güvenli olmayan bir şekilde başlatabilir.
Uygulamanız aşağıdaki işlemlerin her ikisini de gerçekleştiriyorsa sistem güvenli olmayan bir amaç başlatma işlemi algılar ve StrictMode ihlali gerçekleşir:
- Uygulamanız, teslim edilen bir intent'in ekstralarından iç içe yerleştirilmiş bir intent'i paketinden çıkarıyor.
- Uygulamanız, bu iç içe yerleştirilmiş amaçla hemen bir uygulama bileşeni başlatıyor. Örneğin, amacı
startActivity(),startService()veyabindService()içine iletiyor.
Bu durumu nasıl tanımlayacağınız ve uygulamanızda nasıl değişiklik yapacağınız hakkında daha fazla bilgi için Medium'daki Android Nesting Intents (Android İç İçe Geçirme Amaçları) blog yayınını okuyun.
Güvenli olmayan intent başlatma işlemlerini kontrol etme
Uygulamanızda güvenli olmayan amaç başlatmalarını kontrol etmek için aşağıdaki kod snippet'inde gösterildiği gibi VmPolicy öğenizi yapılandırırken
detectUnsafeIntentLaunch()
işlevini çağırın. Uygulamanız bir StrictMode ihlali tespit ederse 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()); }
Amaca dayalı reklamları daha sorumlu bir şekilde kullanma
Güvenli olmayan bir amaç başlatma ve StrictMode ihlali olasılığını en aza indirmek için aşağıdaki en iyi uygulamaları izleyin.
Yalnızca amaçlardaki temel ekstraları kopyalayın ve gerekli temizleme ve doğrulama işlemlerini gerçekleştirin. Uygulamanız, bir intent'teki ekstraları 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)'ı çağırdığında ortaya çıkar.
Uygulamanız bu işlemlerden birini gerçekleştiriyorsa yalnızca alıcı bileşenin beklediği ekstraları kopyalayın. Diğer amaç (kopyayı alan) dışa aktarılmamış 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, dahili iç içe yerleştirilmiş bir intent kullanarak bir uygulama bileşeni başlatmayı planlıyorsanız bu bileşenin android:exported özelliğini false olarak ayarlayın.
İç içe yerleştirilmiş amaç yerine PendingIntent kullanın. Bu sayede, başka bir uygulama, kapsayan Intent öğesinin PendingIntent öğesini paketinden çıkardığında, diğer uygulama, uygulamanızın kimliğini kullanarak PendingIntent öğesini başlatabilir. Bu yapılandırma, diğer uygulamanın uygulamanızdaki dışa aktarılmamış bir bileşen de dahil olmak üzere herhangi bir bileşeni güvenli bir şekilde başlatmasına olanak tanır.
Şekil 2'deki şema, sistemin kontrolü uygulamanızdan (istemci) başka bir uygulamaya (hizmet) ve tekrar uygulamanıza nasıl aktardığını gösterir:
- Uygulamanız, başka bir uygulamadaki etkinliği çağıran bir amaç oluşturuyor. Bu amaca, ek olarak bir
PendingIntentnesnesi ekliyorsunuz. Bu beklemede olan intent, uygulamanızdaki bir bileşeni çağırıyor. Bu bileşen dışa aktarılmıyor. - Diğer uygulama, uygulamanızın intent'ini aldıktan sonra yerleştirilmiş
PendingIntentnesnesini ayıklar. - Diğer uygulama,
PendingIntentnesnesindesend()yöntemini çağırır. - Kontrol uygulamanıza geri verildikten sonra sistem, uygulamanızın bağlamını kullanarak bekleyen amaçlı işlemleri çağırır.
Şekil 2. İç içe yerleştirilmiş beklemede olan intent kullanıldığında uygulamalar arası iletişimin diyagramı.
Dolaylı intent alma
Uygulamanızın hangi dolaylı intent'leri alabileceğini bildirmek için <intent-filter> öğesi içeren manifest dosyanızda her uygulama bileşeniniz için bir veya daha fazla intent filtresi tanımlayın.
Her intent filtresi, kabul ettiği intent türünü intentin işlemine, verilerine ve kategorisine göre belirtir. Sistem, yalnızca intent filtrelerinizden birinden geçebiliyorsa uygulama bileşeniniz için dolaylı intent sunar.
Not: Belirgin intent, 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 bildirmelidir.
Örneğin, bir resim galerisi uygulamasındaki bir etkinliğin iki filtresi olabilir: biri resmi görüntülemek, diğeri ise resmi düzenlemek için. Etkinlik başladığında
Intent incelenir ve Intent içindeki
bilgilere (ör. düzenleyici kontrollerinin gösterilip gösterilmeyeceği) göre nasıl davranılacağına karar verilir.
Her intent filtresi, uygulamanın manifest dosyasındaki <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şenine diğer uygulamaların erişip erişemeyeceğini gösterir. Bazı durumlarda (ör. amaç filtreleri LAUNCHER kategorisini içeren etkinlikler) bu özelliği true olarak ayarlamak yararlıdır. Aksi takdirde, bu özelliği false olarak ayarlamak daha güvenlidir.
Uyarı: Uygulamanızdaki bir etkinlik, hizmet veya yayın alıcısı intent filtreleri kullanıyorsa ve android:exported için değeri açıkça ayarlamıyorsa uygulamanız Android 12 veya sonraki sürümleri çalıştıran bir cihaza yüklenemez.
<intent-filter> içinde, aşağıdaki üç öğeden birini veya daha fazlasını kullanarak kabul edilecek amaç türlerini belirtebilirsiniz:
<action>nameözelliğinde kabul edilen intent işlemini bildirir. Değer, sınıf sabiti değil, bir işlemin değişmez dize değeri olmalıdır.<data>- Veri URI'sinin (
scheme,host,port,path) ve MIME türünün çeşitli yönlerini belirten bir veya daha fazla özellik kullanarak kabul edilen veri türünü bildirir. <category>- ,
nameözelliğinde kabul edilen amaç kategorisini bildirir. Değer, sınıf sabiti değil, bir işlemin değişmez dize değeri olmalıdır.Not: Dolaylı intentleri almak için intent filtresine
CATEGORY_DEFAULTkategorisini eklemeniz gerekir.startActivity()vestartActivityForResult()yöntemleri, tüm amaçlarıCATEGORY_DEFAULTkategorisini belirtmiş gibi değerlendirir. Bu kategoriyi intent filtrenizde belirtmezseniz hiçbir örtülü amaç etkinliğinizle çözümlenmez.
Örneğin, veri türü metin olduğunda ACTION_SEND intent'ini almak için intent filtresi içeren bir etkinlik bildirimi aşağıda verilmiştir:
<activity android:name="ShareActivity" android:exported="false"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
<action>, <data> veya <category> öğesinin birden fazla örneğini içeren bir filtre oluşturabilirsiniz.
Bu durumda, bileşenin bu filtre öğelerinin tüm kombinasyonlarını işleyebildiğinden emin olmanız gerekir.
Birden fazla türde amaç işlemek istediğinizde ancak yalnızca belirli işlem, veri ve kategori türü kombinasyonlarında birden fazla amaç filtresi oluşturmanız gerekir.
Dolaylı intent, üç öğenin her biriyle karşılaştırılarak bir filtreye karşı test edilir. Amacın bileşene teslim edilebilmesi için üç testin tamamını geçmesi gerekir. Android sistemi, bu bileşenlerden biriyle bile eşleşemezse amacı bileşene iletmez. Ancak bir bileşenin birden fazla amaç filtresi olabileceğinden, bileşenin filtrelerinden birinden geçmeyen bir amaç 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: Intent filtresi kullanmak, diğer uygulamaların bileşenlerinizi başlatmasını engellemek için güvenli bir yöntem değildir. Amaç filtreleri, bir bileşenin yalnızca belirli türdeki örtülü amaçlara yanıt vermesini kısıtlasa da geliştirici, bileşen adlarınızı belirlerse başka bir uygulama, açık bir amaç kullanarak uygulama bileşenlerinizi başlatabilir.
Bileşenlerinizden birini yalnızca kendi uygulamanızın başlatabilmesi önemliyse manifest dosyanızda intent filtreleri bildirmeyin. Bunun yerine, söz konusu bileşen için exported özelliğini "false" olarak ayarlayın.
Benzer şekilde, farklı bir uygulamanın Service hizmetini yanlışlıkla çalıştırmamak için kendi hizmetinizi başlatırken her zaman belirgin intent kullanın.
Not:
Tüm etkinlikler için intent filtrelerinizi manifest dosyasında beyan etmeniz gerekir.
Ancak yayın alıcılar için filtreler, registerReceiver() çağrılarak dinamik olarak kaydedilebilir. Ardından, unregisterReceiver() ile iletişime geçerek alıcının kaydını iptal edebilirsiniz. Bu sayede uygulamanız, yalnızca belirli bir süre boyunca çalışırken belirli yayınları dinleyebilir.
Örnek filtreler
Amaç filtresi davranışlarından bazılarını göstermek için 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 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_MAINişlemi, bunun ana giriş noktası olduğunu ve herhangi bir amaç verisi beklemediğini gösterir.CATEGORY_LAUNCHERkategorisi, bu etkinliğin simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini gösterir.<activity>öğesindeiconile bir simge belirtilmemişse sistem,<application>öğesindeki simgeyi kullanır.
Etkinliğin uygulama başlatıcıda görünmesi için bu ikisinin birlikte eşlenmesi gerekir.
İkinci etkinlik olan ShareActivity, metin ve medya içeriklerinin paylaşılmasını kolaylaştırmak için tasarlanmıştır. Kullanıcılar bu etkinliğe MainActivity üzerinden giderek girebilir ancak iki amaç filtresinden biriyle eşleşen örtülü bir amaç yayınlayan başka bir uygulamadan da doğrudan ShareActivity'e girebilir.
Not: MIME türü,
application/vnd.google.panorama360+jpg, Google panorama API'leriyle işleyebileceğiniz panoramik fotoğrafları belirten özel bir veri türüdür.
Niyetleri diğer uygulamaların intent filtreleriyle eşleştirme
Başka bir uygulama Android 13'ü (API düzeyi 33) veya sonraki sürümleri hedefliyorsa uygulamanızın amacını yalnızca amacınız, söz konusu uygulamadaki bir <intent-filter> öğesinin işlemleri ve kategorileriyle eşleşiyorsa işleyebilir. Sistem bir eşleşme bulamazsa ActivityNotFoundException oluşturur.
Gönderen uygulama bu istisnayı işlemelidir.
Benzer şekilde, uygulamanızı Android 13 veya sonraki sürümleri hedefleyecek şekilde güncellerseniz harici uygulamalardan kaynaklanan tüm amaçlar, yalnızca bu amaç uygulamanızın bildirdiği bir <intent-filter> öğesinin işlemleri ve kategorileriyle eşleşiyorsa uygulamanızın dışa aktarılan bir bileşenine teslim edilir. 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 tutulmaz:
- Herhangi bir amaç filtresi bildirmeyen bileşenlere gönderilen amaçlar.
- Aynı uygulamadan kaynaklanan amaçlar.
- Sistemden kaynaklanan amaçlar; yani "sistem UID"den (uid=1000) gönderilen amaçlar. Sistem uygulamaları arasında
system_serverveandroid:sharedUserIdayarınıandroid.uid.systemolarak belirleyen uygulamalar yer alır. - Kökten kaynaklanan amaçlar.
Amaca göre eşleştirme hakkında daha fazla bilgi edinin.
Beklemedeki bir intent'i kullanma
PendingIntent nesnesi, Intent nesnesinin sarmalayıcısıdır. PendingIntent
birincil amacı, yabancı bir uygulamaya, içerdiği Intent öğesini uygulamanızın kendi sürecinden yürütülüyormuş gibi kullanma izni vermektir.
Beklemede olan intentin başlıca kullanım alanları şunlardır:
- Kullanıcı, bildiriminizle bir işlem yaptığında yürütülecek bir amaç beyan etme
(Android sisteminin
NotificationManager,Intent'ı yürütür). - Kullanıcı, uygulama widget'ınızla işlem yaptığında yürütülecek bir amaç bildirir (Ana ekran uygulaması
Intentişlemini yürütür). - Belirtilen ileriki bir zamanda yürütülecek bir amaç beyan etme (Android sisteminin
AlarmManager,Intentyürütülür).
Her Intent nesnesi belirli bir uygulama bileşeni türü (Activity, Service veya BroadcastReceiver) tarafından işlenecek şekilde tasarlanır. Bu nedenle, PendingIntent de aynı şekilde oluşturulmalıdır. Beklemede olan intent kullanılırken uygulamanız, startActivity() gibi bir aramayla intenti yürütmez. Bunun yerine, ilgili oluşturucu yöntemini çağırarak PendingIntent oluşturduğunuzda amaçlanan bileşen türünü beyan etmeniz gerekir:
PendingIntent.getActivity()içinActivitybaşlatan birIntent.PendingIntent.getService()içinIntentServicebaşlatır.PendingIntent.getBroadcast()içinIntentBroadcastReceiverbaşlatır.
Uygulamanız diğer uygulamalardan bekleyen amaçlar almıyorsa,
PendingIntent oluşturmak için yukarıdaki yöntemler muhtemelen ihtiyacınız olacak PendingIntent tek yöntemlerdir.
Her yöntem, mevcut uygulamayı Context, sarmalamak istediğiniz Intent ve intent'in nasıl kullanılması gerektiğini belirten bir veya daha fazla işaret alır (ör. intent'in birden fazla kez kullanılıp kullanılamayacağı).
Bekleyen amaçları 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şebilirliği belirtme
Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa uygulamanızın oluşturduğu her PendingIntent nesnesinin değişkenliğini belirtmeniz gerekir. Belirli bir PendingIntent nesnenin değiştirilebilir veya değiştirilemez olduğunu belirtmek için sırasıyla PendingIntent.FLAG_MUTABLE veya PendingIntent.FLAG_IMMUTABLE işaretini kullanın.
Uygulamanız, değiştirilebilirlik işaretini ayarlamadan PendingIntent nesnesi oluşturmaya çalışırsa sistem IllegalArgumentException oluşturur ve Logcat'te aşağıdaki mesaj gösterilir:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
Mümkün olduğunda değişmez beklemedeki 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. Bir PendingIntent nesnesi değişmezse diğer uygulamalar, amaç çağırma sonucunu ayarlamak için amacı 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ında bunun yerine değiştirilebilir PendingIntent nesneler gerekir:
- Bildirimlerde doğrudan yanıt işlemlerini destekler. 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öntemineFILL_IN_CLIP_DATAişaretini ileterek istersiniz. - Bildirimleri Android Auto çerçevesiyle ilişkilendirme,
CarAppExtenderörneklerini kullanma. PendingIntentörneklerini kullanarak görüşmeleri baloncuklara yerleştirme. Değişebilir birPendingIntentnesne, sisteminFLAG_ACTIVITY_MULTIPLE_TASKveFLAG_ACTIVITY_NEW_DOCUMENTgibi doğru işaretleri uygulamasına olanak tanır.requestLocationUpdates()veya benzer API'leri çağırarak cihaz konumu bilgisi isteme. DeğiştirilebilirPendingIntentnesnesi, sistemin konum yaşam döngüsü etkinliklerini temsil eden amaç ekstraları eklemesine olanak tanır. Bu etkinlikler arasında konum değişikliği ve sağlayıcının kullanıma sunulması yer alır.AlarmManager'ı kullanarak alarm planlama DeğiştirilebilirPendingIntentnesnesi, sisteminEXTRA_ALARM_COUNTamaç ekstrasını eklemesine olanak tanır. Bu ek bilgi, tekrarlayan bir alarmın kaç kez tetiklendiğini gösterir. Bu ekstrayı içeren amaç, tekrarlayan bir alarmın birden çok kez tetiklenip tetiklenmediği konusunda (ör. cihaz uyku modundayken) uygulamayı doğru şekilde bilgilendirebilir.
Uygulamanız değiştirilebilir bir PendingIntent nesnesi oluşturuyorsa belirgin intent kullanmanız ve ComponentName bölümünü doldurmanız önemle tavsiye edilir. Bu sayede, başka bir uygulama PendingIntent işlevini her çağırdığında ve kontrolü uygulamanıza geri verdiğinde uygulamanızdaki aynı bileşen her zaman başlatılır.
Bekleyen intent'lerde açık intent'ler kullanma
Diğer uygulamaların, uygulamanızın beklemede olan intentlerini nasıl kullanabileceğini daha iyi tanımlamak için beklemede olan intentleri her zaman belirgin intent etrafında sarmalayın. Bu en iyi uygulamayı takip etmenize yardımcı olmak için aşağıdakileri yapın:
- Temel intent'in action (işlem), package (paket) ve component (bileşen) alanlarının ayarlandığından emin olun.
-
Bekleyen amaçlar oluşturmak için Android 6.0'da (API düzeyi 23) eklenen
FLAG_IMMUTABLEyöntemini kullanın. Bu işaret,PendingIntentalan uygulamaların doldurulmamış özellikleri doldurmasını engeller. UygulamanızınminSdkVersiondeğeri22veya daha düşükse aşağıdaki kodu kullanarak güvenlik ve uyumluluk bilgilerini 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 örtülü bir intent aldığında, üç açıya 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, bir uygulamanın manifest dosyasındaki intent filtresi beyanına göre intent'lerin uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.
İşlem testi
Kabul edilen intent işlemlerini belirtmek için bir intent filtresi, 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çilmesi için Intent içinde belirtilen işlem, filtrede listelenen işlemlerden biriyle eşleşmelidir.
Filtrede herhangi bir işlem listelenmiyorsa niyetin eşleşeceği bir şey yoktur. Bu nedenle, tüm niyetler testi geçemez. Ancak bir Intent işlem belirtmiyorsa filtre en az bir işlem içerdiği sürece testi geçer.
Kategori testi
Kabul edilen intent kategorilerini belirtmek için bir intent filtresi, aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <category> öğesi bildirebilir:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
Bir amacın kategori testini geçmesi için Intent
içindeki her kategorinin filtredeki bir kategoriyle eşleşmesi gerekir. Ters durum gerekli değildir. Amaç filtresi, Intent içinde belirtilenden daha fazla kategori bildirebilir ve Intent yine de başarılı olur. Bu nedenle, filtrede hangi kategoriler beyan edilirse edilsin, kategori içermeyen bir amaç her zaman bu testi geçer.
Not:
Android, startActivity() ve startActivityForResult()'ye iletilen tüm örtülü amaçlara otomatik olarak CATEGORY_DEFAULT kategorisini 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" kategorisi içermesi gerekir.
Veri testi
Kabul edilen intent verilerini belirtmek için bir intent filtresi, 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 bir veri türü (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 özellikler için olası değerler gösterilmektedir:
content://com.example.project:200/folder/subfolder/etc
Bu URI'da şema content, ana makine com.example.project, bağlantı noktası 200 ve yol folder/subfolder/etc'dır.
Bu özelliklerin 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 belirtilmezse bağlantı noktası yok sayılır.
- Hem şema hem de ana makine belirtilmemişse yol yok sayılır.
Bir intent'teki URI, bir filtredeki URI spesifikasyonuyla karşılaştırıldığında yalnızca filtrede yer alan URI bölümleriyle karşılaştırılır. Örneğin:
- Bir filtre yalnızca şema belirtiyorsa bu şemaya sahip tüm URI'ler filtreyle eşleşir.
- Bir filtre şema ve yetkili belirtiyor ancak yol belirtmiyorsa aynı şema ve yetkiliye sahip tüm URI'ler, yollarından bağımsız olarak filtreyi geçer.
- Bir filtre şema, yetkili ve yol belirtiyorsa yalnızca aynı şema, yetkili ve yola sahip URI'ler filtreyi geçer.
Not: Yol adının yalnızca kısmi olarak eşleşmesini sağlamak için yol belirtimi joker yıldız (*) içerebilir.
Veri testi, hem URI'yi hem de amaçtaki MIME türünü filtrede belirtilen bir URI ve MIME türüyle karşılaştırır. Kurallar aşağıdaki gibidir:
- Ne URI ne de MIME türü içeren bir amaç, yalnızca filtre herhangi bir URI veya MIME türü belirtmiyorsa testi geçer.
- Bir URI içeren ancak MIME türü içermeyen (URI'den açıkça belirtilmeyen veya çıkarılamayan) bir amaç, yalnızca URI'si filtrenin URI biçimiyle eşleşiyorsa ve filtre de MIME türü belirtmiyorsa testi geçer.
- Bir MIME türü içeren ancak URI içermeyen bir amaç, yalnızca filtre aynı MIME türünü listeliyorsa ve bir URI biçimi belirtmiyorsa testi geçer.
- Hem URI hem de MIME türü (açık veya URI'den çıkarılabilir) içeren bir amaç, yalnızca bu tür filtrede listelenen bir türle eşleşiyorsa testin MIME türü bölümünü geçer. URI'si filtredeki bir URI ile eşleşiyorsa veya
content:ya dafile:URI'si varsa ve filtrede URI belirtilmemişse testin URI kısmını geçer. Başka bir deyişle, bir bileşenin filtre listelerinde yalnızca bir MIME türü varsa bu bileşenincontent:vefile:verilerini desteklediği varsayılır.
Not: Bir amaç URI veya MIME türü belirtiyorsa <intent-filter> içinde <data> öğesi yoksa veri testi başarısız olur.
Bu son kural (d), bileşenlerin bir dosyadan veya içerik sağlayıcıdan yerel veriler alabileceği 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, <data> öğesinin Android'e bileşenin 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>
Bir veri türünü belirten ancak URI'yi belirtmeyen filtreler, mevcut verilerin çoğu içerik sağlayıcılar tarafından dağıtıldığından belki de en yaygın olanıdır.
Yaygın bir diğer yapılandırma ise şeması ve veri türü olan 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 verilerini alabileceğini bildirir:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Intent eşleşme
Intent'ler, yalnızca etkinleştirilecek bir hedef bileşeni bulmak için değil, aynı zamanda cihazdaki bileşenler grubu hakkında bir şeyler bulmak için de intent filtreleriyle eşleştirilir. Örneğin, Home uygulaması, ACTION_MAIN işlemi ve CATEGORY_LAUNCHER kategorisini belirten intent filtrelerine sahip tüm etkinlikleri bularak Uygulama Başlatıcıyı doldurur.
Eşleşme yalnızca Amaç'taki işlemler ve kategoriler, IntentFilter sınıfının dokümanlarında açıklandığı gibi filtreyle eşleşirse başarılı olur.
Uygulamanız, Home uygulamasının yaptığına benzer şekilde amaç eşleştirme özelliğini kullanabilir.
PackageManager, belirli bir amaca uygun tüm bileşenleri döndüren bir dizi query...() yönteme ve bir amaca yanıt verecek en iyi bileşeni belirleyen benzer bir resolve...() yöntem serisine sahiptir. Örneğin, queryIntentActivities(), bağımsız değişken olarak iletilen amaca yönelik olarak gerçekleştirilebilecek tüm etkinliklerin listesini döndürürken queryIntentServices(), benzer bir hizmet listesi döndürür.
Her iki yöntem de bileşenleri etkinleştirmez. Yalnızca yanıt verebilecek olanları listeler. Yayın alıcılar için benzer bir yöntem
queryBroadcastReceivers() vardır.