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.Intent
öğesinistartActivity()
öğesine ileterekActivity
öğesinin yeni bir örneğini başlatabilirsiniz.Intent
başlatılacak etkinliği tanımlar ve gerekli verileri taşır.Etkinlik tamamlandığında sonuç almak istiyorsanız
startActivityForResult()
numaralı telefonu arayın. Etkinliğiniz, sonucu etkinliğinizinonActivityResult()
geri çağırmasında ayrı birIntent
nesnesi olarak alır. Daha fazla bilgi için Etkinlikler kılavuzuna bakın. - Hizmet başlatma
Service
, kullanıcı arayüzü olmadan arka planda işlemler gerçekleştiren bir bileşendir. Android 5.0 (API düzeyi 21) ve sonraki sürümlerdeJobScheduler
ile hizmet başlatabilirsiniz.JobScheduler
hakkında daha fazla bilgi içinAPI-reference documentation
konusuna bakın.Android 5.0'dan (API düzeyi 21) önceki sürümlerde
Service
sınıfının yöntemlerini kullanarak bir hizmet başlatabilirsiniz.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 tanımlar 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, çeşitli yayınlar aracılığıyla sistem etkinlikleri (ör. sistemin başlatılması veya cihazın şarj olmaya başlaması) hakkında bilgi verir.
Intent
öğesinisendBroadcast()
veyasendOrderedBroadcast()
öğesine ileterek diğer uygulamalara yayın yapabilirsiniz.
Bu sayfanın geri kalanında, niyetlerin 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
ComponentName
belirterek hangi uygulamanın hangi bileşeninin amacı karşılayacağını belirtir. Genellikle kendi uygulamanızdaki bir bileşeni başlatmak için açık bir amaç 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şlemi bildirir. Bu da 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 örtülü bir amaç 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.

1.şekil 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 (B Etkinliği) başlatır.
Örtülü bir intent kullandığınızda Android sistemi, intent'in içeriğini cihazdaki diğer uygulamaların manifest dosyasında belirtilen intent filtreleriyle karşılaştırarak başlatılacak uygun bileşeni bulur. Amaç bir amaç 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ındaki, bileşenin almak istediği intent türünü belirten bir ifadedir. Örneğin, bir etkinlik için amaç filtresi bildirerek diğer uygulamaların etkinliğinizi belirli bir amaçla doğrudan başlatmasını sağlayabilirsiniz. Benzer şekilde, bir etkinlik için herhangi bir amaç 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 bildirmeyin. Bir hizmeti başlatmak için örtülü amaç kullanmak güvenlik riski oluşturur. Çünkü hangi hizmetin amaca yanıt vereceğinden emin olamazsınız ve kullanıcı, hangi hizmetin başlatıldığını göremez. Android 5.0 (API düzeyi 21) sürümünden başlayarak, bindService()
işlevini örtülü bir amaçla ç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 bir şekilde gerçekleştirmek için kullandığı bilgileri (ör. yapılacak işlem ve üzerinde işlem yapılacak veriler) taşır.
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 amacın açık olmasını sağlayan kritik bilgi parçasıdır. 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:
Service
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ı, hedef bileşenin tam nitelikli sınıf adı (ör. uygulamanın paket adı dahil) kullanılarak belirtilebilen birComponentName
nesnesidir. Örneğin,com.example.ExampleActivity
. Bileşen adınısetComponent()
,setClass()
,setClassName()
veyaIntent
oluşturucusuyla ayarlayabilirsiniz. - İşlem
- Gerçekleştirilecek genel işlemi (ör. görüntüleme veya seçme) belirten bir dize.
Yayın yapma amacı söz konusu olduğunda bu, gerçekleşen ve bildirilen işlemdir. İş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
Intent
sınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitlerini belirtirsiniz. Aktivite başlatmak için kullanılan bazı yaygın işlemler şunlardır:ACTION_VIEW
- Bu işlemi, bir etkinliğin kullanıcıya gösterebileceği bazı bilgiler (ör. galeri uygulamasında görüntülenecek bir fotoğraf veya harita uygulamasında görüntülenecek bir adres) olduğunda
startActivity()
ile birlikte bir amaçta kullanın. ACTION_SEND
- Paylaşma niyeti 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 niyeti
startActivity()
ile birlikte kullanmanız gerekir.
Genel işlemleri tanımlayan daha fazla sabit için
Intent
sınıf referansına bakın. Diğer işlemler, Android çerçevesinde başka yerlerde tanımlanır. Örneğin, sistemin Ayarlar uygulamasında belirli ekranları açan işlemler içinSettings
içinde tanımlanır.Bir niyetin işlemini
setAction()
ile veya birIntent
oluşturucu ile belirtebilirsiniz.Kendi işlemlerinizi tanımlarsanız aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını ön ek olarak eklediğinizden emin olun:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- Veri
- İşlem yapılacak verilere ve/veya bu verilerin MIME türüne referans veren URI (bir
Uri
nesnesi). Sağlanan veri türü genellikle amacın işlemine göre belirlenir. Örneğin, işlemACTION_EDIT
ise 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ı oynatamayabilir. 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. Özellikle de veriler
content:
URI'si olduğunda.content:
URI, verilerin cihazda bulunduğunu veContentProvider
tarafından kontrol edildiğini gösterir. Bu sayede verilerin MIME türü sistem tarafından görülebilir.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. Çünkü bu işlevler birbirinin değerini geçersiz kılar. URI ve MIME türünü ayarlamak için her zamansetDataAndType()
kullanın. - Kategori
- Amacın hangi bileşen türü tarafından işleneceği 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 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
Intent
sı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ümlendiğini 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 birBundle
nesnesi oluşturabilir, ardındanBundle
nesnesiniIntent
içineputExtras()
ile ekleyebilirsiniz.Örneğin,
ACTION_SEND
ile e-posta gönderme amacı oluştururkenEXTRA_EMAIL
anahtarıyla to alıcısını,EXTRA_SUBJECT
anahtarıyla da subject konusunu belirtebilirsiniz.Intent
sınıfı, standartlaştırılmış veri türleri için birçokEXTRA_*
sabiti belirtir. Kendi ek anahtarlarınızı (uygulamanızın aldığı amaçlar için) beyan etmeniz 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
Parcelable
veyaSerializable
verilerini kullanmayın. Bir uygulama,Bundle
nesnesindeki verilere erişmeye çalışırsa ancak paketlenmiş veya serileştirilmiş sınıfa erişimi yoksa sistemRuntimeException
oluşturur. - İşaretler
- İşlemin meta verileri olarak işlev gören
Intent
sı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 amaç örneği
Açık amaç, uygulamanızdaki belirli bir etkinlik veya hizmet gibi belirli bir uygulama bileşenini başlatmak için kullandığınız amaçtır. Açık bir amaç oluşturmak için Intent
nesnesinin bileşen adını tanımlayın. Diğer tüm amaç özellikleri isteğe bağlıdır.
Örneğin, uygulamanızda 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ı amaç
Örtülü bir amaç, 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 örtülü amaç 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çla (ACTION_SEND
işlemiyle ve "text/plain" verilerini taşıyan bir amaç) başa çıkabilecek yüklü uygulamaları inceler. İsteği işleyebilecek tek bir uygulama varsa bu uygulama hemen açılır ve amaç verilir. Başka hiçbir uygulama bu durumu işleyemiyorsa uygulamanız oluşan ActivityNotFoundException
yakalayabilir. Niyet birden fazla etkinlik tarafından kabul edilirse 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 bilgiyi Kullanıcıyı başka bir uygulamaya gönderme rehberinde bulabilirsiniz.

Şekil 2. Seçici iletişim kutusu.
Uygulama seçiciyi zorunlu kılma
Örtülü 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çenek haline getirebilir. Varsayılan seçme özelliği, kullanıcının her seferinde aynı uygulamayı kullanmak isteyeceğ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, amaca birden fazla uygulama 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()
'a iletin.
Bu örnekte, createChooser()
yöntemine iletilen amaca yanıt veren uygulamaların listesini içeren bir iletişim kutusu gösteriliyor ve sağlanan metin, iletişim kutusu başlığı olarak kullanılıyor.
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 gerçekleştirmek için amaç başlatabilir. Platform güvenliğini artırmak amacıyla Android 12 (API düzeyi 31) ve sonraki sürümlerde, uygulamanız bir amacı güvenli olmayan şekilde başlatırsa 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 iki işlemi de gerçekleştiriyorsa sistem güvenli olmayan bir amaç başlatma işlemi algılar ve StrictMode ihlali meydana gelir:
- 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ş niyeti kullanarak hemen bir uygulama bileşeni başlatıyor. Örneğin, niyeti
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 amaç başlatmalarını 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 detectUnsafeIntentLaunch()
işlevini VmPolicy
yapılandırırken ç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()); }
Amaçları 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 ile 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.
2. şekildeki diyagramda, sistemin kontrolü uygulamanızdan (istemci) başka bir uygulamaya (hizmet) ve tekrar uygulamanıza nasıl aktardığı gösterilmektedir:
- Uygulamanız, başka bir uygulamadaki etkinliği çağıran bir amaç oluşturuyor. Bu amaca, ek olarak bir
PendingIntent
nesnesi ekliyorsunuz. Bu bekleyen amaç, 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 iç içe yerleştirilmiş
PendingIntent
nesnesini ayıklar. - Diğer uygulama,
PendingIntent
nesnesindesend()
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ş bir beklemedeki amaç kullanılırken uygulamalar arası iletişimin şeması.
Dolaylı bir amaç alma
Uygulamanızın hangi örtülü intent'leri alabileceğini duyurmak için <intent-filter>
öğesi içeren manifest dosyanızdaki her uygulama bileşeniniz için bir veya daha fazla intent filtresi bildirin.
Her amaç filtresi, kabul ettiği amaç türünü amacın işlemine, verilerine ve kategorisine göre belirtir. Sistem, yalnızca amaç filtrelerinizden birinden geçebilen amaçlar için uygulama bileşenine örtülü bir amaç gönderir.
Not: Belirgin bir amaç, bileşenin bildirdiği amaç 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 filtrelerini 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ürünü belirtebilirsiniz:
<action>
- Kabul edilen amaç işlemini
name
özelliğinde 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: Örtülü amaçları almak için amaç filtresine
CATEGORY_DEFAULT
kategorisini eklemeniz gerekir.startActivity()
vestartActivityForResult()
yöntemleri, tüm amaçlarıCATEGORY_DEFAULT
kategorisini 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
amacını almak için amaç 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 amaç türünü 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.
Örtülü bir amaç, bu amacı üç öğenin her biriyle karşılaştırarak bir filtreye karşı test edilir. Niyetin bileşene teslim edilebilmesi için üç testin tamamını geçmesi gerekir. Android sistemi, amaçlardan biriyle bile eşleşemezse bileşene teslim etmez. 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ı önlemenin güvenli bir yolu 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şeninizi başlatabilir.
Yalnızca kendi uygulamanızın bileşenlerinizden birini 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 açık bir amaç kullanın.
Not:
Tüm etkinlikler için amaç 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ı silebilirsiniz. Bu işlem, uygulamanız çalışırken yalnızca belirli bir süre boyunca belirli yayınları dinlemesine olanak tanır.
Örnek filtreler
Niyet 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_MAIN
işlemi, bunun ana giriş noktası olduğunu gösterir ve herhangi bir amaç verisi beklemez.CATEGORY_LAUNCHER
kategorisi, bu etkinliğin simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini gösterir.<activity>
öğesindeicon
ile 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şleştirilmesi 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 intent filtresinden biriyle eşleşen örtülü bir intent 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:
- Niyet filtreleri bildirmeyen bileşenlere gönderilen niyetler.
- Aynı uygulamadan kaynaklanan amaçlar.
- Sistemden kaynaklanan amaçlar; yani "sistem UID'si"nden (uid=1000) gönderilen amaçlar. Sistem uygulamaları arasında
system_server
veandroid:sharedUserId
ayarınıandroid.uid.system
olarak belirleyen uygulamalar yer alır. - Kökten kaynaklanan amaçlar.
Amaca göre eşleştirme hakkında daha fazla bilgi edinin.
Beklemedeki bir amaç kullanma
PendingIntent
nesnesi, Intent
nesnesinin sarmalayıcısıdır. PendingIntent
'nın temel amacı, yabancı bir uygulamaya, içerdiği Intent
'yi uygulamanızın kendi sürecinden yürütülüyormuş gibi kullanma izni vermektir.
Bekleyen bir amaçla ilgili 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
'siIntent
'yi yürütür). - Kullanıcı, uygulama widget'ınızla bir işlem yaptığında (ana ekran uygulaması
Intent
öğesini yürütür) yürütülecek bir amaç beyan etme. - Belirtilen gelecekteki bir zamanda yürütülecek bir amaç beyan etme (Android sisteminin
AlarmManager
,Intent
yü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. Bekleyen bir amaç kullanılırken uygulamanız, startActivity()
gibi bir aramayla amacı yürütmüyor. Bunun yerine, ilgili oluşturucu yöntemini çağırarak PendingIntent
oluşturduğunuzda amaçlanan bileşen türünü bildirmeniz gerekir:
PendingIntent.getActivity()
içinIntent
Activity
başlatır.PendingIntent.getService()
içinIntent
Service
ile başlayan birPendingIntent.getBroadcast()
içinIntent
BroadcastReceiver
ile başlayan bir
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
, sarmak istediğiniz Intent
ve amacın nasıl kullanılması gerektiğini belirten bir veya daha fazla işaret alır (ör. amacın 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şkenlik işaretini ayarlamadan bir 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 bekleyen 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ı bunun yerine değiştirilebilir PendingIntent
nesneleri gerektirir:
- 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,
fillIn()
yöntemine işaret olarakFILL_IN_CLIP_DATA
ileterek bu değişikliği istersiniz. - Bildirimleri Android Auto çerçevesiyle ilişkilendirme,
CarAppExtender
örneklerini kullanma. PendingIntent
örneklerini kullanarak görüşmeleri baloncuğa yerleştirme. Değişebilir birPendingIntent
nesne, sisteminFLAG_ACTIVITY_MULTIPLE_TASK
veFLAG_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ştirilebilirPendingIntent
nesnesi, 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ştirilebilirPendingIntent
nesnesi, sisteminEXTRA_ALARM_COUNT
intent 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 fazla kez tetiklenip tetiklenmediği konusunda (ör. cihaz uyku modundayken) uygulamayı doğru şekilde bilgilendirebilir.
Uygulamanızda değiştirilebilir bir PendingIntent
nesnesi oluşturuluyorsa açık bir amaç kullanmanız ve ComponentName
doldurmanız önemle tavsiye edilir. Bu sayede, başka bir uygulama PendingIntent
öğesini 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 bekleyen intent'lerini nasıl kullanabileceğini daha iyi tanımlamak için bekleyen intent'leri her zaman açık intent ile sarmalayın. Bu en iyi uygulamayı takip etmek 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_IMMUTABLE
işlevini kullanın. Bu işaret,PendingIntent
alan uygulamaların doldurulmamış özellikleri doldurmasını engeller. UygulamanızınminSdkVersion
değeri22
veya 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 amaç aldığında, üç açıya göre amaç filtreleriyle karşılaştırarak amaç 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 bildirgesine göre intent'lerin uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.
İşlem testi
Kabul edilen amaç işlemlerini belirtmek için bir amaç 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 amaç kategorilerini belirtmek için bir amaç 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 kategori, filtredeki bir kategoriyle eşleşmelidir. Tersi 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, amaç filtrelerinde "android.intent.category.DEFAULT"
kategorisi bulunmalıdır.
Veri testi
Kabul edilen amaç verilerini belirtmek için bir amaç filtresi, aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <data>
öğe 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ü (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
'dir.
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 belirtilmezse yol yoksayılır.
Bir amaçtaki URI, bir filtrenin 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 yetki belirtiyor ancak yol belirtmiyorsa aynı şema ve yetkiye 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, amaçtaki URI ve MIME türünü, filtrede belirtilen 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ç, testin MIME türü bölümünü yalnızca bu tür, filtrede listelenen bir türle eşleşiyorsa 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 bölümü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 olanlardır.
Diğer yaygın 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, Ev uygulaması, ACTION_MAIN
işlemini ve CATEGORY_LAUNCHER
kategorisini belirten amaç 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 amaçla eşleşebilecek 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 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.