Intent
, işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir
başka bir uygulama bileşeninden farklıdır.
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. Yeni bir web sitesiIntent
ileterek birActivity
örneği Hedef:startActivity()
.Intent
başlangıç etkinliğini açıklar ve gerekli tüm verileri taşır.Etkinlik tamamlandığında sonuç almak istiyorsanız
startActivityForResult()
numaralı telefonu arayın. Etkinliğiniz, sonucu etkinliğinizinonActivityResult()
geri çağırma işlevinde ayrı birIntent
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ümlerdeJobScheduler
ile bir hizmet başlatabilirsiniz. Okuyucu Gelirleri Yöneticisi'niJobScheduler
hakkında bilgi içinAPI-reference documentation
.Android 5.0'dan (API düzeyi 21) önceki sürümlerde bir hizmeti başlatmak için
Service
sınıfının yöntemlerini inceleyeceğiz.startService()
'a birIntent
göndererek tek seferlik bir işlem (ör. dosya indirme) gerçekleştirmek için bir hizmet başlatabilirsiniz.Intent
, başlatılacak hizmeti tanımlar ve gerekli tüm verileri taşır.Hizmet, istemci-sunucu arayüzüyle tasarlanmışsa başka bir bileşenden
bindService()
öğesineIntent
ileterek. Daha fazla bilgi için Hizmetler kılavuzuna bakın. - Yayın yapma
Yayın, herhangi bir uygulamanın alabileceği bir mesajdır. Sistemde çok çeşitli sistemin yeniden başlatılması veya cihazın şarj edilmeye başlaması gibi sistem etkinlikleri için yayınlar.
Intent
değerinisendBroadcast()
veyasendOrderedBroadcast()
değerine ileterek diğer uygulamalara yayın yayınlayabilirsiniz.
Bu sayfanın geri kalanında, intent'lerin işleyiş şekli ve nasıl kullanılacağı açıklanmaktadır. İlgili bilgiler için bkz. Diğer Uygulamalarla Etkileşim ve İçerik Paylaşma.
Amaç türleri
İki tür intent vardır:
- Açık intent'ler, tam bir
ComponentName
belirterek hangi uygulamanın hangi bileşeninin intent'i karşılayacağını belirtir. Bir sonraki bir bileşeni başlatmak için genellikle çünkü başlatmak istediğiniz etkinliğin veya hizmetin sınıf adını bildiğinizden kendi uygulamanıza. Örneğin, Örneğin, bir kullanıcı işlemine yanıt olarak uygulamanızda yeni bir etkinlik başlatabilir ya da arka planda dosya indirmek için bir hizmet. - Dolaylı intent'ler belirli bir bileşeni adlandırmaz, bunun yerine gerçekleştirilecek genel bir işlem tanımlar. Bu işlem, başka bir uygulamadaki bir bileşenin bu işlemi gerçekleştirmesine olanak tanır. Örneğin, kullanıcıya harita üzerinde bir konum göstermek istiyorsanız başka bir uygulamanın harita üzerinde belirli bir konumu göstermesini istemek için örtülü intent kullanabilirsiniz.
Şekil 1'de, etkinlik başlatırken intent'in nasıl kullanıldığı gösterilmektedir.
Intent
nesnesi, belirli bir etkinlik bileşenini açıkça belirtir.
o bileşeni hemen başlatır.

Şekil 1. Dolaylı intent,
başka bir etkinlik başlatmak üzere sistem üzerinden teslim edildi: [1] A Etkinliği
Intent
adlı kişiyi bir işlem açıklamasıyla birlikte ekler ve startActivity()
adlı kullanıcıya iletir. [2] Android sistemi, intent ile eşleşen bir intent filtresi için tüm uygulamaları arar. Bir eşleşme bulunduğunda [3] sistem, onCreate()
yöntemini çağırarak ve Intent
değerini ileterek eşleşen etkinliği (B Etkinliği) başlatır.
Dolaylı intent kullandığınızda Android sistemi başlamak için uygun bileşeni bulur
amacın içeriğini
olanak tanır. Amaç bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve yayınlar.
Intent
nesnesini tanımlayın. 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ındaki bir ifadedir. bileşenin çalıştırıldığı amaçların türünü otomatik olarak oluşturulur. Örneğin, bir etkinlik için intent filtresi tanımlayarak diğer uygulamaların etkinliğinizi doğrudan belirli bir amaçla başlatmasını sağlarsınız. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz etkinlik başlatılabilir. belirli bir amaç için kullanılabilir.
Dikkat: Uygulamanızın güvenli olduğundan emin olmak için
uygunsuz kullan
niyetini Service
başlatın ve yalnızca
hizmetleriniz için intent filtreleri bildirin. Dolaylı intent kullanarak bir hizmeti başlatmak,
hangi hizmetin amaca yanıt vereceğinden emin olamadığınız için
güvenlik tehlikesi oluşturabilirsiniz.
ve kullanıcı hangi hizmetin başlatıldığını göremez. Android 5.0 (API düzeyi 21) sürümünden itibaren, bindService()
metodunu implicit intent ile çağırırsanız sistem bir istisna atar.
Amaç oluşturma
Intent
nesnesi, Android sisteminin kullandığı bilgileri taşır
hangi bileşenin başlatılacağını (tam bileşen adı veya bileşen gibi)
alıcı bileşeninin kullandığı bilgiler ile birlikte alıcı bileşeninin
gereken tüm bilgileri (ör. yapılacak işlem ve üzerinde işlem yapılacak veriler) içeren,
Intent
içinde yer alan temel bilgiler şunlardır:
- Bileşen adı
- Başlanacak bileşenin adı.
Bu isteğe bağlıdır ancak bir amacı açık yapan kritik bilgi parçasıdır. Yani amaç, yalnızca bileşen adı tarafından tanımlanan uygulama bileşenine gönderilmelidir. Bileşen adı olmadan intent örtülü olur ve sistem, intent'i hangi bileşenin alması gerektiğine diğer intent bilgilerine (ör. işlem, veri ve kategori) göre karar verir. Belirli bir uygulamanızda kullanıyorsanız, bileşen adını belirtmeniz gerekir.
Not: Bir
Service
başlatırken bileşen adını her zaman belirtin. Aksi takdirde, hangi hizmetin intent'e yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başlatıldığını göremez.Intent
nesnesinin bu alanı birComponentName
nesnesi olup uygulamanın paket adı da dahil olmak üzere hedef bileşenin tam nitelikli sınıf adını kullanarak belirtebilirsiniz (ör.com.example.ExampleActivity
). Bileşen adınısetComponent()
,setClass()
,setClassName()
, veyaIntent
oluşturucu. - İşlem
- Yapılacak genel işlemi belirten bir dize (ör. görüntüle 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ı belirler. Özellikle: verilerde bulunan bilgileri dahil etmemeniz gerekir.
Uygulamanızdaki intent'ler tarafından (veya uygulamanızdaki bileşenleri çağırmak için diğer uygulamalar tarafından) kullanılmak üzere kendi işlemlerinizi belirtebilirsiniz ancak genellikle
Intent
sınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitlerini belirtirsiniz. Aşağıda bazı örnekler verilmiştir: yaygın olarak kullanılan işlemler:ACTION_VIEW
- Bir etkinliğin kullanıcıya gösterebileceği bazı bilgilere sahip olduğunuzda (ör. bir galeri uygulamasında görüntülenecek bir fotoğraf veya bir harita uygulamasında görüntülenecek bir adres) bu işlemi
startActivity()
ile bir intent içinde kullanın. ACTION_SEND
- Paylaşım amacı olarak da bilinir. Kullanıcının yapabileceği bazı verileriniz olduğunda bunu
startActivity()
ile niyette kullanmalısınız e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabilirsiniz.
Genel işlemleri tanımlayan daha fazla sabit değer için
Intent
sınıf referansına bakın. Diğer işlemler, Android çerçevesinin başka bir yerinde (ör. sistemdeki Ayarlar uygulamasında belirli ekranları açan işlemler içinSettings
) tanımlanır.Bir amaca yönelik işlemi
setAction()
veya birIntent
oluşturucuyla belirtebilirsiniz.Kendi işlemlerinizi tanımlarsanız uygulamanızın paket adını eklediğinizden emin olun şu örnekte gösterildiği gibi ön ek olarak ekleyin:
- Veri
- Verilerin başvuruda bulunduğu URI (bir
Uri
nesnesi) ve/veya MIME türü olabilir. Sağlanan veri türü genellikle intent'in işlemine göre belirlenir. Örneğin, işlemACTION_EDIT
ise veriler, düzenlenecek dokümanın URI'sini içermelidir.Amaç oluştururken URI'ye ek olarak veri türünün de (MIME türü) belirtilmesi genellikle önemlidir. Örneğin, resimleri görüntüleyebilen bir etkinlik muhtemelen ses dosyası çalmak için kullanabileceğiniz bir koddur. Verilerinizin MIME türünü belirtmek, Android sisteminin intent'inizi alacak en iyi bileşeni bulmasına yardımcı olur. Ancak MIME türü bazen URI'den çıkarılabilir. Özellikle veriler
content:
URI'si olduğunda bu geçerlidir.content:
URI, verilerin cihazda bulunduğunu ve birContentProvider
tarafından kontrol edildiğini belirtir. Bu da veri MIME türünü sisteme görünür hale getirir.Yalnızca veri URI'sini ayarlamak için
setData()
yöntemini ç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 çağırmayın. Bu iki işlev birbirinin değerini geçersiz kılar. İkisini de ayarlamak için her zamansetDataAndType()
kullan URI ve MIME türü. - Kategori
- Bileşenin türü hakkında ek bilgiler içeren bir dize
bu müzakerelere
hazırlanabilirsiniz. Bir intent'e istediğiniz sayıda kategori açıklaması yerleştirilebilir ancak çoğu intent için kategori gerekmez.
Yaygın kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE
- Hedef etkinlik, bir bağlantının referans verdiği verileri (ör. resim veya e-posta mesajı) görüntülemek için web tarayıcısı tarafından başlatılmasına izin verir.
CATEGORY_LAUNCHER
- Etkinlik, bir görevin ilk etkinliğidir ve uygulamanın başlatıcısını kullanabilirsiniz.
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 belirleyici özelliklerini temsil eder. Android sistemi, bu özellikleri okuyarak hangi uygulama bileşenini başlatması gerektiğini çözebilir. Ancak bir intent, uygulama bileşeninde nasıl çözüleceğini etkilemeyen ek bilgiler taşıyabilir. Niyet, aşağıdaki bilgileri de sağlayabilir:
- Ekstralar
- Şu işlemleri gerçekleştirmek için gereken ek bilgileri içeren anahtar/değer çiftleri
istenen eylem.
Bazı işlemler belirli veri URI'leri kullandığı gibi bazı işlemler de belirli ekstralar kullanır.
Çeşitli
putExtra()
yöntemleriyle ekstra veri ekleyebilirsiniz, Her biri iki parametre kabul eder: anahtar adı ve değer. Ayrıca, tüm ek verileri içeren birBundle
nesnesi oluşturabilir ve ardındanputExtras()
ileBundle
'yiIntent
içine ekleyebilirsiniz.Örneğin,
ACTION_SEND
ile e-posta gönderme amacıyla bir intent oluştururkenEXTRA_EMAIL
anahtarıyla alıcıyı veEXTRA_SUBJECT
anahtarıyla konuyu belirtebilirsiniz.Intent
sınıfı birçokEXTRA_*
sabiti belirtiyor izin modudur. Kendi ek anahtarlarınızı bildirmeniz gerekiyorsa ( uygulamanızın alanlarından biri) ve uygulamanızın paket adını eklediğinizden emin olun şu örnekte gösterildiği gibi ön ek olarak ekleyin:const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Dikkat: Başka bir uygulamanın almasını beklediğiniz bir intent gönderirken
Parcelable
veyaSerializable
verilerini kullanmayın. Bir uygulama,Bundle
nesnesindeki verilere erişmeye çalışır ancak paketlenmiş veya serileştirilmiş sınıfa erişimi yoksa sistem birRuntimeException
oluşturur. - İşaretler
- İşaretler, intent için meta veri işlevi gören
Intent
sınıfında tanımlanır. İşaretler, Android sistemine bir etkinliğin nasıl başlatılacağını (örneğin, görev ve hedef kitlenize ait kullanıma sunulmasından sonra nasıl ele alınacağına ilişkin bilgiler (örneğin, en son etkinlikler).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 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 aşağıdaki kodla başlatabilirsiniz:
// 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)
// 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)
Yapıcı, uygulamaya Context
ve bileşene 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
Örtük intent, cihazdaki herhangi bir uygulamayı çağırarak işlemi gerçekleştirebilecek bir işlem belirtir. Dolaylı intent, uygulamanız ancak diğer uygulamalar muhtemelen bunu yapabiliyor ve kullanıcının hangi uygulamayı kullanacağını seçmesini istiyorsunuz.
Örneğin, kullanıcının diğer kullanıcılarla paylaşmasını istediğiniz bir içeriğiniz varsa ACTION_SEND
işlemini içeren bir intent oluşturun ve paylaşılacak içeriği belirten ekstralar ekleyin. Bu amaca dayalı startActivity()
etkinliğini çağırdığınızda kullanıcı, içeriği paylaşacağı uygulamayı seçebilir.
// 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. }
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
startActivity()
çağrıldığında sistem
hangilerinin bu tür bir niyeti işleyebildiğini belirlemek için yüklü tüm uygulamaları inceler (
amacı, "text/plain" değerini içeren ACTION_SEND
işlemidir
verileri) kullanabilirsiniz. Bunu gerçekleştirebilecek tek bir uygulama varsa bu uygulama hemen açılır ve intent verilir. Başka hiçbir uygulama bunu işleyemezse uygulamanız
ActivityNotFoundException
bahsedeceğim. Birden fazla etkinlik niyeti kabul ederse sistem, kullanıcının hangi uygulamayı kullanacağını seçebilmesi için Şekil 2'de gösterilen gibi bir iletişim kutusu görüntüler.
Diğer uygulamaları başlatma hakkında daha fazla bilgiyi kullanıcıyı başka bir uygulamaya gönderme başlıklı rehberde de bulabilirsiniz.

Şekil 2. Seçici iletişim kutusu.
Uygulama seçiciyi zorunlu kılma
Dolaylı niyetinize yanıt veren birden fazla uygulama olduğunda Kullanıcı hangi uygulamanın kullanılacağını seçebilir ve söz konusu uygulamayı varsayılan seçenek olarak ayarlayabilir. eyleme dökülebilir. Varsayılan bir ayar seçebilme olanağı, kullanıcının bir işlem gerçekleştirmesi sırasında faydalıdır. büyük olasılıkla her zaman aynı uygulamayı kullanmak ister örneğin, bir web sayfasını açarken (kullanıcılar genellikle tek bir web tarayıcısı tercih edilir).
Ancak intent'e birden fazla uygulama yanıt verebiliyorsa ve kullanıcı her seferinde farklı bir uygulama kullanmak istiyorsa açıkça bir seçici iletişim kutusu göstermeniz gerekir. Seçici iletişim kutusu şu soruyu sorar:
kullanıcının işlem için hangi uygulamanın kullanılacağını seçmesine izin verir (kullanıcı, kendisi için
işlem). Örneğin, uygulamanız ACTION_SEND
işlemiyle "paylaş" işlemini gerçekleştirdiğinde kullanıcılar mevcut durumlarına bağlı olarak farklı bir uygulama kullanarak paylaşım yapmak isteyebilir. Bu nedenle, Şekil 2'de gösterildiği gibi her zaman seçici iletişim kutusunu kullanmalısınız.
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 iletilen intent'e yanıt veren uygulamaların listesini içeren bir iletişim kutusu gösterilmektedir. İletişim kutusu başlığında ise sağlanan metin kullanılmaktadır.
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) }
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
Güvenli olmayan intent başlatmalarını algılama
Uygulamanız, uygulamanızın içindeki bileşenler arasında gezinmek veya başka bir uygulama adına işlem yapmak için intent'ler başlatabilir. Platform güvenliğini artırmak amacıyla Android 12 (API düzeyi 31) ve sonraki sürümlerde, uygulamanız güvenli olmayan bir intent başlatırsa sizi uyaran bir hata ayıklama özelliği sunulur. Örneğin, uygulamanız iç içe yerleştirilmiş bir niyetin güvenli olmayan bir şekilde başlatılmasını ve bu niyet başka bir amaç için fazladan olduğunu unutmayın.
Uygulamanız aşağıdaki işlemlerin ikisini de gerçekleştirirse sistem güvenli olmayan bir uygulama algılar intent lansmanı ve StrictMode ihlali gerçekleşir:
- Uygulamanız, gönderilen bir intent'in ekstralarından iç içe yerleştirilmiş bir intent'i paketten çıkarıyor.
- Uygulamanız, bu iç içe yerleştirilmiş niyeti kullanarak hemen bir uygulama bileşeni başlatır (ör. niyeti
startActivity()
,startService()
veyabindService()
'a iletme).
Bu durumu nasıl tespit edeceğiniz ve uygulamanızda nasıl değişiklik yapacağınız hakkında 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şlatmaları olup olmadığını kontrol etmek için şu numarayı arayın:
detectUnsafeIntentLaunch()
aşağıdaki kod snippet'inde gösterildiği gibi VmPolicy
öğenizi yapılandırdığınızda görünür. Eğer
bir StrictMode ihlali algıladığında, uygulamanızın
hassas olabilecek bilgileri koruma altına alır.
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()) }
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 olasılığını en aza indirmek için: bu en iyi uygulamaları izleyin.
Amaçlardaki yalnızca önemli ekstraları kopyalayın ve gerekli olan tüm işlemleri yapın
hijyen ve doğrulama gibi konuları ele alacağız. Uygulamanız, ekstraları bir intent'ten yeni bir bileşeni başlatmak için kullanılan başka bir intent'e kopyalayabilir. Bu durum,
uygulama çağrıları
putExtras(Intent)
veya
putExtras(Bundle)
.
Uygulamanız bu işlemlerden birini gerçekleştiriyorsa yalnızca alıcı bileşenin beklediği ekstraları kopyalayın. Kopyayı alan diğer intent, dışa aktarılmayan bir bileşeni başlatıyorsa ekstraları, bileşeni başlatan intent'e kopyalamadan önce temizleyin ve doğrulayın.
Uygulamanızın bileşenlerini gereksiz yere dışa aktarmayın. Örneğin, dahili iç içe yerleştirilmiş bir intent kullanarak bir uygulama bileşeni başlatmak istiyorsanız söz konusu bileşenin android:exported
özelliğini false
olarak ayarlayın.
Bir PendingIntent
yerine
iç içe yerleştirilmiş bir intent. Bu sayede, başka bir uygulama Intent
içeren PendingIntent
'yi paketten çıkardığında uygulamanızın kimliğini kullanarak PendingIntent
'yi başlatabilir. Bu yapılandırma, diğer uygulamanın uygulamanızdaki dışa aktarılmamış bileşenler de dahil olmak üzere herhangi bir bileşeni güvenli bir şekilde başlatmasına olanak tanır.
Şekil 2'deki şema, sistemin kontrolü (istemci) nasıl aktardığını gösterir. uygulamanızı başka bir (hizmet) uygulamasına ve tekrar uygulamanıza geri döndürebilirsiniz:
- Uygulamanız, başka bir uygulamada bir etkinliği çağıran bir intent oluşturur. Bu intent'e ek olarak bir
PendingIntent
nesnesi eklersiniz. Bu bekleyen intent, uygulamanızda bir bileşeni çağırıyor. Bu bileşen dışa aktarılmıyor. - Diğer uygulama, uygulamanızın intent'ini aldıktan sonra iç içe yerleştirilmiş
PendingIntent
nesnesini ayıklıyor. - Diğer uygulama,
PendingIntent
nesnesindesend()
yöntemini çağırır. - Kontrolü uygulamanıza geri gönderdikten sonra sistem, beklemede olan bunu göz önünde bulundurun.
Şekil 2. İç içe yerleştirilmiş bekleyen bir öğe kullanılırken uygulamalar arası iletişim şeması isteyebilirsiniz.
Dolaylı intent alma
Uygulamanızın alabileceği örtülü amaçların reklamını yapmak için bir veya daha fazla intent filtresi tanımlayın.
uygulama bileşenlerinizin her birinde bir <intent-filter>
manifest dosyanıza eklenmiş bir öğedir.
Her intent filtresi, niyetin işlemine göre kabul ettiği niyet türlerini belirtir.
veri ve kategoriden oluşur. Sistem, yalnızca
intent filtrelerinizden birinden geçebilir.
Not: Belirli bir intent, bileşenin tanımladığı intent filtrelerinden bağımsız olarak her zaman hedefine yayınlanır.
Bir uygulama bileşeni, yapabileceği her benzersiz iş için ayrı filtreler bildirmelidir.
Örneğin, bir resim galerisi uygulamasındaki etkinliklerden birinde biri filtre olmak üzere iki filtre olabilir.
resmi, düzenlemek için başka bir filtreyi tıklayın. Etkinlik başladığında
Intent
cihazını inceler ve bilgilere dayanarak nasıl davranacağına karar verir
(ör. düzenleyici denetimlerini göstermek veya göstermemek) için Intent
.
Her intent filtresi bir <intent-filter>
ile tanımlanır.
öğesi, uygulamanın manifest dosyasındaki ilgili uygulama bileşenine (ör.
<activity>
olarak
öğesi).
<intent-filter>
öğesi içeren her uygulama bileşeninde,
şunun için açıkça bir değer ayarla:
android:exported
Bu özellik, uygulama bileşeninin diğer uygulamalar tarafından erişilebilir olup olmadığını belirtir. Bazılarında
durum, örneğin amaç filtrelerinde
LAUNCHER
kategorisini, bu özelliği true
olarak ayarlamanız yararlı olur. Aksi halde
bu özelliği false
olarak ayarlamak daha güvenlidir.
Uyarı: Bir etkinlik, hizmet veya yayın
uygulamanızdaki alıcı, intent filtrelerini kullanıyor ve değeri açık bir şekilde ayarlamıyor.
android:exported
için uygulamanız, şu özelliklere sahip bir cihaza yüklenemez:
Android 12 veya sonraki bir sürümü çalıştıran.
<intent-filter>
içinde,
bir veya daha fazla istek türü kullanarak kabul edilecek niyet türünü belirtebilirsiniz
şu üç unsuru içerir:
<action>
- Kabul edilen intent işlemini
name
özelliğinde belirtir. Değer değeri, sınıf sabiti değil, eylemin harflerden oluşan dize değeri olmalıdır. <data>
- Veri URI'sinin (
scheme
,host
,port
,path
) çeşitli yönlerini belirten bir veya daha fazla özellik ve MIME türünü kullanarak kabul edilen veri türünü belirtir. <category>
- Kabul edilen amaç kategorisini
name
özelliğinde belirtir. Değer bir eylemin sınıf sabiti değil, harflerden oluşan dize değeri olmalıdır.Not: Örtük intent'ler almak için intent filtresine
CATEGORY_DEFAULT
kategorisini eklemeniz gerekir. YöntemlerstartActivity()
vestartActivityForResult()
tüm amaçları ele alır sankiCATEGORY_DEFAULT
kategorisini açıklamışlar gibi. Intent filtrenizde bu kategoriyi belirtmezseniz hiçbir implicit intent etkinliğinizle çözülmez.
Örneğin, aşağıda gösterildiği gibi, bir intent filtresi içeren bir etkinlik bildirimi
Veri türü metin olduğunda ACTION_SEND
niyeti:
<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>
Etiketin birden fazla örneğini içeren bir filtre oluşturabilirsiniz:
<action>
,
<data>
veya
<category>
.
Bunu yaparsanız, bileşenin her şeyi işleyebileceğinden emin olmanız
kombinasyonlarını sağlayabilir.
Birden fazla türde intent'i yalnızca belirli işlem, veri ve kategori türü kombinasyonlarında işlemek istiyorsanız birden fazla intent filtresi oluşturmanız gerekir.
Örtük intent, intent'in üç öğenin her biriyle karşılaştırılmasıyla filtreye göre test edilir. Amacın, bileşene yayınlanması için üç testten de geçmesi gerekir. Bunlardan biriyle bile eşleşemezse Android sistemi, intent'i bileşene iletmez. Ancak bir bileşenin birden fazla intent filtresi olabileceğinden, bileşenin filtrelerinden birinden geçmeyen bir intent başka bir filtreden geçebilir. Sistemin amaçları nasıl çözdüğü hakkında daha fazla bilgiyi aşağıdaki bölümde bulabilirsiniz Niyet Çözümü hakkında.
Dikkat: Amaç filtresi kullanmak, diğer uygulamaların başlamasını engellemenin güvenli bir yolu değildir
bileşenlerine ayıralım. Amaç filtreleri bir bileşeni yalnızca belirli türde örtülü amaçlara yanıt verecek şekilde kısıtlasa da geliştirici bileşen adlarınızı belirlerse başka bir uygulama, açık amaç kullanarak uygulama bileşeninizi başlatabilir.
Yalnızca kendi uygulamanızın bileşenlerinizden birini başlatabilmesi önemliyse manifest dosyanızda intent filtreleri tanımlamayın. Bunun yerine, söz konusu bileşen için exported
özelliğini "false"
olarak ayarlayın.
Benzer şekilde, yanlışlıkla farklı bir uygulamanın Service
çalıştırılmasını önlemek için kendi hizmetinizi baş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ılarak dinamik olarak kaydedilebilir. Ardından, unregisterReceiver()
ile alıcının kaydını iptal edebilirsiniz. Böylece uygulamanız
uygulamanız açıkken yalnızca belirli bir süre boyunca belirli yayınları dinlemek için
çalışıyor.
Örnek filtreler
Amaç filtresi davranışlarından bazılarını göstermek için aşağıda bir örnek verilmiştir: bir sosyal medya paylaşımı uygulamasının manifest dosyasından:
<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ı simgesini kullanarak ilk kez başlattığında açılan etkinliktir:
ACTION_MAIN
işlemi, bunun ana giriş noktası olduğunu belirtir ve herhangi bir intent verisi beklemez.CATEGORY_LAUNCHER
kategorisi, bu etkinliğin simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini gösterir.<activity>
öğesindeicon
ile bir simge belirtilmezse sistem,<application>
öğesindeki simgeyi kullanır.
Etkinliğin uygulama başlatıcıda görünmesi için bu iki öğenin birlikte eşlenmesi gerekir.
İkinci etkinlik olan ShareActivity
, metin ve medya içeriğini paylaşmayı kolaylaştırmayı amaçlar. Kullanıcılar MainActivity
üzerinden giderek bu etkinliğe girebilse de
ayrıca, doğrudan ShareActivity
kodu gönderen başka bir uygulamadan da
intent filtresinden biriyle eşleşen intent
Not: MIME türü,
application/vnd.google.panorama360+jpg
, şunları belirten özel bir veri türüdür:
pek çok yolu vardır ve bunları Google
panorama API'lerini kullanın.
Amaçları diğer uygulamaların amaçlarıyla eşleştirin intent filtreleri
Başka bir uygulama Android 13 (API düzeyi 33) veya sonraki sürümleri hedefliyorsa
amacınız bir uygulamanın işlemleri ve kategorileriyle eşleşiyorsa
<intent-filter>
öğesi. Sistem,
denk düştüğünde bir
ActivityNotFoundException
Gönderen uygulama bu istisnayı ele almalıdır.
Benzer şekilde, uygulamanızı Android 13 veya sonraki sürümleri hedefleyecek şekilde güncellerseniz harici uygulamalardan gelen tüm intent'ler, uygulamanızın dışa aktarılan bir bileşenine yalnızca söz konusu intent, uygulamanızın tanımladığı bir <intent-filter>
öğesinin işlemleri ve kategorileriyle eşleşirse gönderilir. Bu davranış
gönderen uygulamanın hedef SDK sürümünden bağımsız olarak gerçekleştirilir.
Aşağıdaki durumlarda intent eşleştirme zorunlu kılınmaz:
- Herhangi bir intent filtresi bildirmeyen bileşenlere yayınlanan intentler.
- Aynı uygulamadan gelen intent'ler.
- Sistemden kaynaklanan amaçlar; yani
"sistem UID'si" (uid=1000). Sistem uygulamaları,
system_server
veandroid:sharedUserId
'uandroid.uid.system
olarak ayarlayan uygulamaları içerir. - Kökten gelen amaçlar.
Amaç eşleştirme hakkında daha fazla bilgi edinin.
Beklemedeki bir amacı kullanma
PendingIntent
nesnesi, Intent
nesnesini saran bir sarmalayıcıdır. PendingIntent
'ün birincil amacı, harici bir uygulamaya, içerdiği Intent
'yi uygulamanızın kendi sürecinden yürütülüyormuş gibi kullanma izni vermektir.
Beklemedeki intent'lerin başlıca kullanım alanları şunlardır:
- Kullanıcı bildiriminizle bir işlem gerçekleştirdiğinde çalıştırılacak bir intent beyan etme (Android sisteminin
NotificationManager
,Intent
'ı yürütür). - Kullanıcı
Uygulama Widget'ı
(Ana ekran uygulaması
Intent
öğesini yürütür). - Belirtilen gelecekteki bir zamanda çalıştırılması istenen bir intent'i beyan etme (Android sisteminin
AlarmManager
,Intent
'u yürütür).
Her Intent
nesnesi belirli bir uygulama bileşeni türü (Activity
, Service
veya BroadcastReceiver
) tarafından ele alınacak şekilde tasarlandığı gibi, PendingIntent
de aynı şekilde oluşturulmalıdır. Beklemedeki bir intent kullanılırken uygulamanız, intent'i startActivity()
gibi bir çağrıyla yürütmez. Bunun yerine, ilgili oluşturucu yöntemini çağırarak PendingIntent
'ü oluştururken amaçlanan bileşen türünü belirtmeniz gerekir:
- Şunun için
PendingIntent.getActivity()
:Activity
başlatanIntent
. Service
başlayan birIntent
içinPendingIntent.getService()
.BroadcastReceiver
başlayan birIntent
içinPendingIntent.getBroadcast()
.
Uygulamanız, diğer uygulamalardan beklemedeki amaçlar almadığı sürece,
PendingIntent
oluşturmak için yukarıdaki yöntemler muhtemelen yalnızca
ihtiyacınız olan PendingIntent
yöntem.
Her yöntem mevcut uygulamayı Context
,
Sarmalamak istediğiniz Intent
ve bunu belirten bir veya daha fazla işaret
niyetin nasıl kullanılması gerektiği (ör. niyetin birden fazla kez kullanılıp kullanılamayacağı)
Beklemedeki intent'leri kullanma hakkında daha fazla bilgi için ilgili kullanım alanlarının her birine ait belgelere (ör. Bildirimler ve Uygulama Widget'ları API kılavuzları) bakın.
Değişkenliği belirtin
Uygulamanız Android 12 veya sonraki bir sürümü hedefliyorsa
her PendingIntent
nesnesinin değişkenliğini sağlar. Belirli bir PendingIntent
nesnesinin 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 PendingIntent
nesnesi oluşturmaya çalışırsa
değişkenlik bayrağı ayarlanmadan bırakılırsa, sistem bir
IllegalArgumentException
ve
Logcat'te şu mesaj görünür:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
Mümkün olduğunda bekleyen ve değiştirilemeyen intent'ler oluşturun
Uygulamanız çoğu durumda sabit PendingIntent
nesneleri oluşturmalıdır.
aşağıdaki kod snippet'inde gösteriliyor. PendingIntent
nesnesi sabitse
diğer uygulamalar, çağrının sonucunu ayarlamak için amacı
isteyebilirsiniz.
val pendingIntent = PendingIntent.getActivity(applicationContext,REQUEST_CODE , intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
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:
- Şurada doğrudan yanıt işlemlerini destekleme:
bildirimlerine bakın. Doğrudan yanıt, yanıtla ilişkili PendingIntent nesnesinde klip verilerinde bir değişiklik yapılmasını gerektirir. Genellikle bu değişikliği,
fillIn()
yöntemineFILL_IN_CLIP_DATA
işaretini göndererek istersiniz. CarAppExtender
örneklerini kullanarak bildirimleri Android Auto çerçevesiyle ilişkilendirmePendingIntent
örneklerini kullanarak görüşmeleri baloncuklara yerleştirme. DeğişebilirPendingIntent
nesnesi, sistemin doğru işaretler,FLAG_ACTIVITY_MULTIPLE_TASK
veFLAG_ACTIVITY_NEW_DOCUMENT
.- Sesli arama yaparak cihaz konum bilgisi isteme
requestLocationUpdates()
veya benzer API'ler. DeğişkenPendingIntent
nesnesi, sistemin konum yaşam döngüsü etkinliklerini temsil eden intent ekstraları eklemesine olanak tanır. Bu etkinliklerde şunlar yer alır: bir sağlayıcının sunulmasına neden olabilir. AlarmManager
'u kullanarak alarm planlama. DeğişebilirPendingIntent
nesnesi, sisteminEXTRA_ALARM_COUNT
düşünmelisiniz. Bu ek, tekrarlanan bir alarmın kaç kez tetiklendiğini gösterir. Bu ek bilgi sayesinde intent, tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediği (ör. cihaz uykudayken) konusunda uygulamayı doğru bir şekilde bilgilendirebilir.
Uygulamanız değiştirilebilir bir PendingIntent
nesnesi oluşturuyorsa açık intent kullanmanız ve ComponentName
doldurmanız önemle tavsiye edilir. Bu sayede, başka bir uygulama PendingIntent
'ü çağırıp kontrolü uygulamanıza geri aktardığında 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 her zaman beklemedeki bir niyeti açık amacın etrafına sarmalama. Bu en iyi uygulamayı uygulamanıza yardımcı olması 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.
-
FLAG_IMMUTABLE
kullanın, beklemedeki intent'ler oluşturmak için Android 6.0'da (API düzeyi 23) eklendi. Bu işaret,PendingIntent
alan uygulamaların doldurulmamış özellikleri doldurmasını engeller. UygulamanızınminSdkVersion
değeri22
veya daha düşük olduğu için birlikte güvenlik ve uyumluluk sağlayabilirsiniz. kullanabilirsiniz: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 amaca yönelik en iyi etkinliği, üç unsura göre intent filtreleriyle karşılaştırırız:
- İşlem.
- Veri (hem URI hem de veri türü).
- Kategori.
Aşağıdaki bölümlerde amaçların uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır uygulamanın manifest dosyasındaki intent filtresi beyanına göre.
İşlem testi
Amaç filtreleri, kabul edilen amaç işlemlerini belirtmek için sıfır veya daha fazla değer belirtebilir
<action>
öğeleri, aşağıdaki örnekte gösterildiği gibi:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
Bu filtrenin geçmesi için Intent
bölümünde belirtilen işlemin, filtrede listelenen işlemlerden biriyle eşleşmesi gerekir.
Filtre herhangi bir işlem listelemiyorsa niyetlerin eşleşeceği bir şey yoktur. Bu nedenle tüm niyetler testte başarısız olur. Ancak Intent
bir işlem belirtmez, testin başarılı olması için filtrenin
en az bir işlem içerir.
Kategori testi
Amaç filtreleri, kabul edilen amaç kategorilerini belirtmek için sıfır veya daha fazla bir değer belirtebilir
<category>
öğeleri, aşağıdaki örnekte gösterildiği gibi:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
Kategori testini geçmek için Intent
içindeki her kategori
filtredeki bir kategoriyle eşleşmelidir. Bunun tersi gerekmez. Amaç filtresi
Intent
ve
Intent
hâlâ geçti. Bu nedenle, filtrede hangi kategorilerin tanımlandığına bakılmaksızın, kategori içermeyen bir intent her zaman bu testi geçer.
Not: Android, startActivity()
ve startActivityForResult()
'e iletilen tüm örtülü intent'lere otomatik olarak CATEGORY_DEFAULT
kategorisini uygular.
Etkinliğinizin, önceki <intent-filter>
örneğinde gösterildiği gibi, intent filtrelerinde "android.intent.category.DEFAULT"
için bir kategori içermesi gerekir.
Veri testi
Amaç filtreleri, kabul edilen amaç verilerini belirtmek için sıfır veya daha fazla bir değer belirtebilir
<data>
öğeleri, aşağıdaki örnekte gösterildiği gibi:
<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'nın her bölümü ayrı bir öğedir
özellik: scheme
, host
, port
,
ve path
:
<scheme>://<host>:<port>/<path>
Aşağıdaki örnekte bu özelliklerin olası değerleri gösterilmektedir:
content://com.example.project:200/folder/subfolder/etc
Bu URI'da şema content
, ana makine com.example.project
,
bağlantı noktası 200
, yol ise folder/subfolder/etc
.
<data>
öğelerinde bu özelliklerin her biri isteğe bağlıdır.
ancak doğrusal bağımlılıklar söz konusudur:
- Ş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 intent'teki URI, filtredeki bir URI spesifikasyonuyla karşılaştırılırken yalnızca URI'nin filtreye dahil edilen bölümleriyle karşılaştırılır. Örnek:
- Bir filtre yalnızca bir şema belirtirse bu şemaya sahip tüm URI'ler filtreyle eşleşir.
- Bir filtrede şema ve yetkili kurum belirtilmişse ancak yol belirtilmemişse aynı şemaya ve yetkili kuruma sahip tüm URI'ler, yollarından bağımsız olarak filtreden geçer.
- Bir filtrede bir şema, yetkili ve yol belirtilirse yalnızca aynı şemaya, yetkiliye ve yola sahip URI'ler filtreden geçer.
Not: Yol tanımı, yol adının yalnızca kısmi eşleşmesini gerektirmek için joker karakter yıldızı (*) içerebilir.
Veri testi, intent'teki URI ve MIME türünü, filtrede belirtilen URI ve MIME türüyle karşılaştırır. Kurallar şunlardır:
- Ne URI ne de MIME türü içeren bir intent, yalnızca filtre herhangi bir URI veya MIME türü belirtmediği takdirde testi geçer.
- URI içeren ancak MIME türü içermeyen ( URI), yalnızca URI'si filtrenin URI biçimiyle eşleşirse testi geçer ve filtre benzer şekilde bir MIME türü belirtmez.
- MIME türü içeren ancak URI içermeyen bir intent, yalnızca filtre aynı MIME türünü listelediğinde ve URI biçimi belirtmediğinde testi geçer.
- Hem URI hem de MIME türü içeren (açık veya
URI), yalnızca testin MIME türü bölümünü geçer
type (tür), filtrede listelenen bir türle eşleşir. Testin URI bölümünü geçer.
URI'si filtredeki bir URI ile eşleşirse veya bir
content:
öğesi içeriyorsa veyafile:
URI'sına ekler ve filtre bir URI belirtmez. Diğer bir deyişle, filtresinde yalnızca bir MIME türü listelenen bir bileşenincontent:
vefile:
verilerini desteklediği varsayılır.
Not: Intent bir URI veya MIME türü belirtiyorsa veri testi
<intent-filter>
içinde <data>
öğesi yoksa başarısız olur.
Son kural olan (d) kuralı, bileşenlerin bir dosyadan veya içerik sağlayıcıdan yerel veri alabilmesi beklentisini yansıtır.
Bu nedenle, filtreleri yalnızca bir veri türünü listeleyebilir ve content:
ile file:
şemalarını açıkça adlandırmaları gerekmez.
Aşağıdaki örnekte, bir <data>
öğesinin Android'e bileşenin bir içerik sağlayıcıdan resim verileri alıp görüntüleyebileceğini söylediği tipik bir durum gösterilmektedir:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
Şu özellikteki filtreler: URI değil, veri türü belirtin ancak en yaygın yöntemler olabilir çünkü veri içerik sağlayıcılar tarafından dağıtılıyor.
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 söyler:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Amaç eşleştirme
Intent'ler, yalnızca hedef keşfetmek için değil, intent filtreleriyle de eşleştirilir.
için bir şeyler bulmanız gerekeceğini, ancak aynı zamanda
bu cihazdaki tüm bileşenler. Örneğin Home uygulaması, uygulama başlatıcıyı doldurur.
intent filtrelerine sahip tüm etkinlikleri bularak
ACTION_MAIN
işlem ve
CATEGORY_LAUNCHER
kategorisi.
Eşleşme yalnızca IntentFilter
sınıfının dokümanlarında açıklandığı gibi Intent'teki işlemler ve kategoriler filtreyle eşleşirse başarılı olur.
Uygulamanız, Home uygulamasına benzer şekilde intent eşleştirmeyi kullanabilir.
PackageManager
, query...()
içeren bir grup içeriyor
belirli bir amacı kabul edebilen tüm bileşenleri döndüren ve
en iyi sonucu veren benzer resolve...()
yöntemleriyle
bileşenine hayat verir. Örneğin,
queryIntentActivities()
, gerçekleştirilebilecek tüm etkinliklerin listesini döndürür
amaç, bağımsız değişken olarak iletildiğinde queryIntentServices()
benzer bir hizmet listesi döndürür.
Hiçbir yöntem bileşenleri etkinleştirmez, yalnızca yanıt verebilecek olanları listeler. Benzer bir yöntem var.
Yayın alıcıları için queryBroadcastReceivers()
.