Intent
, başka bir uygulama bileşeninden işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir.
Amaçlar, bileşenler arasındaki iletişimi çeşitli şekillerde kolaylaştırsa da temelde üç kullanım alanı vardır:
- Aktivite başlatma
Activity
, bir uygulamadaki tek bir ekranı temsil eder.startActivity()
öğesineIntent
geçirerekActivity
öğesinin yeni bir örneğini başlatabilirsiniz.Intent
, başlatılacak etkinliği tanımlar ve gerekli verileri taşır.Tamamlandığında etkinlikten 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şlem yapan 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çin şuraya bakın:API-reference documentation
.Android 5.0'dan (API düzeyi 21) önceki sürümler için
Service
sınıfının yöntemlerini kullanarak bir hizmet başlatabilirsiniz.startService()
öğesine birIntent
ileterek tek seferlik bir işlem (dosya indirme gibi) gerçekleştirmek için bir hizmeti başlatabilirsiniz.Intent
, başlatılacak hizmeti tanımlar ve gerekli verileri taşır.Hizmet, istemci-sunucu arayüzüyle tasarlandıysa
bindService()
konumunaIntent
ileterek başka bir bileşenden hizmete bağlanabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzuna bakın. - Yayın yapma
Anons, tüm uygulamaların alabileceği bir mesajdır. Sistem, sistemin başlatılması veya cihazın şarj edilmeye başlaması gibi sistem etkinlikleri için çeşitli yayınlar sağlar.
sendBroadcast()
veyasendOrderedBroadcast()
adlı cihazaIntent
ileterek diğer uygulamalara yayın gönderebilirsiniz.
Bu sayfanın geri kalanında amaçların işleyiş şekli ve nasıl kullanılacağı açıklanmıştır. İlgili bilgiler için bkz. Diğer Uygulamalarla Etkileşim ve İçerik Paylaşma.
Amaç türleri
İki tür niyet vardır:
- Açık intentler, tam
ComponentName
belirterek hangi uygulamanın amacı karşılayacağını belirtir. Başlatmak istediğiniz etkinliğin veya hizmetin sınıf adını bildiğinizden, genellikle kendi uygulamanızda bir bileşeni başlatmak için açık bir intent kullanırsınız. Örneğin, bir kullanıcı işlemine yanıt olarak uygulamanızda yeni bir etkinlik başlatabilir veya arka planda dosya indirmek için bir hizmet başlatabilirsiniz. - Dolaylı amaçlar, belirli bir bileşeni adlandırmaz. Bunun yerine, başka bir uygulamadaki bileşenin bu bileşeni işlemesine olanak tanıyan genel bir işlem bildirir. Örneğin, kullanıcıya haritada bir konum göstermek istiyorsanız, örtülü bir niyet kullanarak başka bir yetenekli uygulamanın haritada belirtilen bir konumu göstermesini isteyebilirsiniz.
Şekil 1'de bir amacın bir etkinliği başlatırken nasıl kullanıldığı gösterilmektedir. Intent
nesnesi belirli bir etkinlik bileşenini açıkça adlandırdığında, sistem hemen bu bileşeni başlatır.
Dolaylı intent kullandığınızda Android sistemi, niyetin içeriğini cihazdaki diğer uygulamaların manifest dosyasında belirtilen amaç filtreleriyle karşılaştırarak başlamak için uygun bileşeni bulur. Amaç bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve Intent
nesnesini sunar. Birden çok intent filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebilmesi için bir iletişim kutusu görüntüler.
Amaç filtresi, bir uygulamanın manifest dosyasında bulunan ve bileşenin almak istediği niyet türlerini belirten bir ifadedir. Örneğin, bir etkinlik için intent filtresi tanımlayarak diğer uygulamaların etkinliğinizi belirli bir amaçla doğrudan başlatmasını mümkün kılarsınız. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz etkinlik yalnızca açık bir niyetle 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 intent filtreleri beyan etmeyin. Bir hizmeti başlatmak için dolaylı niyet kullanmak güvenlik açısından tehlikelidir. Çünkü hangi hizmetin amaca yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başladığını göremez. Android 5.0'dan (API düzeyi 21) başlayarak, bindService()
öğesini dolaylı niyetle çağırırsanız sistem bir istisna atar.
Amaç oluşturma
Intent
nesnesi, Android sisteminin hangi bileşeni başlatacağını belirlemek için kullandığı bilgileri (amacı alması gereken tam bileşen adı veya bileşen kategorisi gibi) ve alıcı bileşeninin işlemi düzgün bir şekilde gerçekleştirmek için kullandığı bilgileri (ör. yapılacak işlem ve uygulanacak veriler) taşır.
Intent
içeriğinde yer alan temel bilgiler şunlardır:
- Bileşen adı
- Başlatılacak bileşenin adı.
Bu isteğe bağlıdır ancak bir amacı açık yapan en önemli bilgi parçasıdır. Bu, niyetin yalnızca bileşen adı tarafından tanımlanan uygulama bileşenine gönderilmesi gerektiği anlamına gelir. Bileşen adı olmadan amaç dolaylı olur ve sistem, diğer amaç bilgilerine (işlem, veri ve kategori gibi aşağıda açıklanan işlem, veri ve kategori) dayanarak amacı hangi bileşenin alması gerektiğine karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmelisiniz.
Not:
Service
başlatılırken her zaman bileşen adını belirtin. Aksi takdirde, hangi hizmetin amaca yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başlatıldığını göremez.Intent
öğesinin bu alanı, uygulamanın paket adı (örneğin,com.example.ExampleActivity
) dahil olmak üzere hedef bileşenin tam sınıf adını kullanarak belirtebileceğiniz birComponentName
nesnesidir. Bileşen adınısetComponent()
,setClass()
,setClassName()
veyaIntent
oluşturucu ile ayarlayabilirsiniz. - İşlem
- Gerçekleştirilecek genel işlemi belirten bir dize (ör. view veya pick).
Yayın amacı söz konusu olduğunda bu, gerçekleşmekte olan ve bildirilmekte olan işlemdir. Bu eylem büyük ölçüde amacın geri kalanının, özellikle de verilerde ve ekstralarda bulunan bilgileri nasıl yapılandırıldığını belirler.
Uygulamanızdaki amaçlara yönelik olarak (veya uygulamanızdaki bileşenleri çağırmak için diğer uygulamalar tarafından kullanılmak üzere) kendi işlemlerinizi belirtebilirsiniz. Ancak genellikle
Intent
sınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitleri belirtirsiniz. Bir etkinlik başlatırken sık yapılan işlemlerden bazıları şunlardır:ACTION_VIEW
- 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) varsa bu işlemi
startActivity()
ile bir amaç için kullanın. ACTION_SEND
- Paylaşma amacı olarak da bilinen bu yöntemi, kullanıcının e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabileceği bazı verileriniz olduğunda
startActivity()
ile bir amaç doğrultusunda kullanmanız gerekir.
Genel işlemleri tanımlayan diğer sabit değerler için
Intent
sınıf referansına bakın. Diğer işlemler Android çerçevesinin başka bir bölümünde tanımlanır (ör. sistemin Ayarlar uygulamasında belirli ekranları açan işlemler içinSettings
).Bir amaç için işlemi
setAction()
veyaIntent
oluşturucu ile belirtebilirsiniz.Kendi işlemlerinizi tanımlarsanız aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını önek olarak eklediğinizden emin olun:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- Veri
- Üzerinde işlem yapılacak verilere başvuruda bulunan URI'dır (bir
Uri
nesnesi) ve/veya bu verinin MIME türüne. Sağlanan veri türü genellikle amacın yaptığı işleme göre belirlenir. Örneğin, işlemACTION_EDIT
ise veriler düzenlenecek belgenin URI'sını içermelidir.Niyet oluştururken genellikle URI'sına ek olarak veri türünü (MIME türü) belirtmek önemlidir. Örneğin, resimleri gösterebilen bir etkinlik, URI biçimleri benzer olsa bile büyük olasılıkla bir ses dosyasını çalamaz. Verilerinizin MIME türünü belirtmeniz, Android sisteminin niyetinizi alacak en iyi bileşeni bulmasına yardımcı olur. Bununla birlikte, özellikle veriler bir
content:
URI'sı olduğunda MIME türü bazen URI'den çıkarılabilir.content:
URI'si, verilerin cihazda bulunduğunu ve birContentProvider
tarafından kontrol edildiğini gösterir. Bu da veri MIME türünü sistem tarafından görünür hale getirir.Yalnızca veri URI'sini ayarlamak için
setData()
çağrısı yapın. Yalnızca MIME türünü ayarlamak içinsetType()
numaralı telefonu arayın. Gerekirse her ikisini desetDataAndType()
ile açıkça ayarlayabilirsiniz.Dikkat: Hem URI hem de MIME türünü ayarlamak istiyorsanız
setData()
vesetType()
ifadelerini çağırmayın. Çünkü bu iki değer diğerinin değerini geçersiz kılar. Hem URI hem de MIME türünü ayarlamak için her zamansetDataAndType()
kullanın. - Kategori
- Amacı işlemesi gereken 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.
Genel kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE
- Hedef etkinlik, bir bağlantı tarafından başvurulan resim veya e-posta mesajı gibi verileri görüntülemek için bir web tarayıcısı tarafından başlatılabilir.
CATEGORY_LAUNCHER
- Etkinlik, görevin ilk faaliyetidir ve sistemin uygulama başlatıcısında listelenir.
Kategorilerin tam listesi için
Intent
sınıf açıklamasına bakın.addCategory()
ile kategori belirtebilirsiniz.
Yukarıda listelenen bu özellikler (bileşen adı, işlem, veriler ve kategori) amacın tanımlayıcı özelliklerini temsil eder. Android sistemi, bu özellikleri okuyarak hangi uygulama bileşenini başlatması gerektiğini çözebilir. Ancak bir amaç, bir uygulama bileşenine nasıl çözümleneceğini etkilemeyen ek bilgiler taşıyabilir. Niyetler aşağıdaki bilgileri de sağlayabilir:
- Ekstralar
- İstenen işlemi gerçekleştirmek için gereken ek bilgileri içeren anahtar/değer çiftleri.
Bazı işlemlerin belirli veri URI'si türlerini kullanması gibi, bazı eylemler de belirli ekstralar kullanır.
Her biri iki parametreyi kabul eden çeşitli
putExtra()
yöntemlerini kullanarak ekstra veri ekleyebilirsiniz: anahtar adı ve değer. Ayrıca, tüm ekstra verilerle birBundle
nesnesi oluşturabilir, ardındanBundle
öğesiniputExtras()
ileIntent
öğesine ekleyebilirsiniz.Örneğin,
ACTION_SEND
ile e-posta göndermek için niyet oluştururkenEXTRA_EMAIL
anahtarıyla alıcıyı, konu'yu iseEXTRA_SUBJECT
anahtarıyla belirtebilirsiniz.Intent
sınıfı, standartlaştırılmış veri türleri için birçokEXTRA_*
sabiti belirtir. Kendi ekstra anahtarlarınızı bildirmeniz gerekiyorsa (uygulamanızın aldığı amaçlar için) aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını önek olarak eklediğinizden emin olun:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Dikkat: Başka bir uygulamanın almasını beklediğiniz bir niyet gönderirken
Parcelable
veyaSerializable
verilerini kullanmayın. Bir uygulama, birBundle
nesnesindeki verilere erişmeye çalışırsa ancak ayrıştırılan veya serileştirilmiş sınıfa erişemezse sistem birRuntimeException
gönderir. - İşaretler
- İşaretler, amaç için meta veri görevi gören
Intent
sınıfında tanımlanır. İşaretler, Android sistemine bir etkinliği nasıl başlatacağını (örneğin, etkinliğin hangi göreve ait olması gerektiği) ve başlatıldıktan sonra nasıl ele alacağını (örneğin, son etkinlikler listesinde olup olmadığı) bildirebilir.Daha fazla bilgi için
setFlags()
yöntemine bakın.
Müstehcen 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 web'den dosya indirmek üzere tasarlanan DownloadService
adlı bir hizmet oluşturduysanız bu hizmeti 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şturucu, Context
uygulamasına ve bileşene bir 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.
Örtülü amaç örneği
Dolaylı intent, cihazda işlemi gerçekleştirebilen herhangi bir uygulamayı çağırabilecek işlemi belirtir. Dolaylı niyet kullanmak, uygulamanız işlemi gerçekleştiremediğinde kullanışlıdır, ancak diğer uygulamalar muhtemelen yapabilir ve kullanıcının hangi uygulamayı kullanacağını seçmesini isterseniz.
Örneğin, kullanıcının başkalarıyla paylaşmasını istediğiniz içeriğiniz varsa ACTION_SEND
işlemiyle bir amaç oluşturun ve paylaşılacak içeriği belirten ekstra öğeler ekleyin. Bu amaçla startActivity()
yöntemini çağırdığınızda kullanıcı, içeriği paylaşacağı uygulamayı seçebilir.
Kotlin
// Create the text message with a string. val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Try to invoke the intent. try { startActivity(sendIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
startActivity()
çağrıldığında, sistem hangilerinin bu tür amaçları işleyebildiğini belirlemek için yüklü tüm uygulamaları inceler (ACTION_SEND
işlemi olan ve "metin/düz" veriler taşıyan bir amaç). Bunu işleyebilecek tek bir uygulama varsa o uygulama hemen açılır ve amacı sağlanır. Başka hiçbir uygulama bunu işleyemezse uygulamanız gerçekleşen ActivityNotFoundException
olayını yakalayabilir. Birden fazla etkinlik amacı kabul ederse sistem, Şekil 2'de gösterilene benzer bir iletişim kutusu görüntüler. Böylece kullanıcı hangi uygulamayı kullanacağını seçebilir.
Kullanıcıyı başka bir uygulamaya gönderme hakkındaki kılavuzda, diğer uygulamaları başlatma hakkında daha fazla bilgi de verilmiştir.
Uygulama seçiciyi zorunlu kılma
Dolaylı amacınıza yanıt veren birden fazla uygulama olduğunda, kullanıcı hangi uygulamayı kullanacağını seçebilir ve bu uygulamayı işlem için varsayılan seçenek yapabilir. Varsayılan seçme özelliği, kullanıcının muhtemelen her seferinde aynı uygulamayı kullanmak istediği bir işlemi gerçekleştirirken (örneğin, bir web sayfasını açarken) (kullanıcılar genellikle yalnızca bir web tarayıcısını tercih eder) faydalı olur.
Ancak birden fazla uygulama amaca 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 kutusunda kullanıcıdan işlem için hangi uygulamanın kullanılacağını seçmesi istenir (kullanıcı işlem için varsayılan bir uygulama seçemez). Örneğin, uygulamanız ACTION_SEND
işlemiyle "paylaş" işlemi gerçekleştirdiğinde, kullanıcılar mevcut durumlarına bağlı olarak farklı bir uygulama kullanarak paylaşımda bulunmak isteyebilirler. 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 bunu aşağıdaki örnekte gösterildiği gibi startActivity()
işlevine iletin.
Bu örnekte, createChooser()
yöntemine iletilen amaca yanıt veren uygulamaların listesini içeren ve sağlanan metni iletişim kutusu başlığı olarak kullanan bir iletişim kutusu gösterilmektedir.
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 lansmanlarını tespit etme
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çlar başlatabilir. Android 12 (API düzeyi 31) ve sonraki sürümler, platform güvenliğini iyileştirmek için uygulamanızın güvenli olmayan bir niyet başlatması durumunda sizi uyaran bir hata ayıklama özelliği sunar. Örneğin, uygulamanız iç içe yerleştirilmiş intent'i güvenli olmayan bir şekilde başlatabilir. İç içe yerleştirilmiş niyet, başka bir amaçta ekstra olarak geçirilen bir amaçtır.
Uygulamanız aşağıdaki işlemlerin her ikisini de gerçekleştirirse sistem güvenli olmayan bir amaç başlatma işlemi algılar ve StrictMode ihlali gerçekleşir:
- Uygulamanız, iç içe yerleştirilmiş bir niyeti, teslim edilen amacın ek özelliklerinden ayırır.
- Uygulamanız, bu iç içe yerleştirilmiş niyeti kullanarak hemen bir uygulama bileşenini başlatır (ör. niyeti
startActivity()
,startService()
veyabindService()
içine iletmek).
Bu durumu tespit etme ve uygulamanızda değişiklik yapma hakkında daha fazla bilgi edinmek için Medium'daki Android İç İçe Yerleştirme Amaçları ile ilgili blog yayınını okuyun.
Güvenli olmayan intent lansmanları olup olmadığını kontrol etme
Uygulamanızda güvenli olmayan amaç başlatmaları olup olmadığını kontrol etmek için VmPolicy
öğenizi yapılandırırken aşağıdaki kod snippet'inde gösterildiği gibi detectUnsafeIntentLaunch()
çağrısı yapın. Uygulamanız StrictMode ihlali algılarsa hassas olabilecek bilgileri korumak için uygulama yürütmeyi durdurmak isteyebilirsiniz.
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()) }
Java
protected void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()); }
Amaçları daha sorumlu bir şekilde kullanın
Güvenli olmayan niyet başlatma ve StrictMode ihlali olasılığını en aza indirmek için bu en iyi uygulamaları izleyin.
Amaçlar dahilindeki yalnızca temel ekstraları kopyalayın ve gerekli tüm sağlık önlemlerini ve doğrulamaları yapın. Uygulamanız, bir amaçtaki ekstraları yeni bir bileşeni kullanıma sunmak için kullanılan
başka bir amaca kopyalayabilir. Bu durum, uygulamanız
putExtras(Intent)
veya
putExtras(Bundle)
ifadesini çağırdığında gerçekleşir.
Uygulamanız bu işlemlerden birini gerçekleştirirse yalnızca alma bileşeninin beklediği ekstraları kopyalayın. Diğer amaç (kopyayı alan) dışa aktarılmayan bir bileşeni başlatırsa bileşeni başlatan amaca kopyalamadan önce ekstraları temizleyin ve doğrulayın.
Uygulamanızın bileşenlerini gereksiz yere dışa aktarmayın. Örneğin, bir uygulama bileşenini iç içe yerleştirilmiş bir niyet kullanarak başlatmak istiyorsanız bu bileşenin android:exported
özelliğini false
olarak ayarlayın.
İç içe yerleştirilmiş intent yerine bir PendingIntent
kullanın. Bu şekilde, başka bir uygulama Intent
öğesini içeren PendingIntent
öğesini paketten çıkardığında diğer uygulama, uygulamanızın kimliğini kullanarak PendingIntent
öğesini başlatabilir. Bu yapılandırma, diğer uygulamanın, dışa aktarılmayan bileşenler de dahil olmak üzere herhangi bir bileşeni uygulamanızda güvenli bir şekilde başlatmasına olanak tanır.
Şekil 2'deki şemada sistemin kontrolü (istemci) uygulamanızdan başka bir (hizmet) uygulamasına ve ardından uygulamanıza nasıl geri taşıdığı gösterilmektedir:
- Uygulamanız, başka bir uygulamadaki etkinliği çağıran bir niyet oluşturuyor. Bu niyete ekstra olarak bir
PendingIntent
nesnesi eklersiniz. Bu bekleyen niyet, uygulamanızda bir bileşeni çağırır; bu bileşen dışa aktarılmaz. - Uygulamanızın amacını aldıktan sonra diğer uygulama iç içe yerleştirilmiş
PendingIntent
nesnesini çıkarır. - Diğer uygulama,
PendingIntent
nesnesindesend()
yöntemini çağırır. - Kontrolü tekrar uygulamanıza geçirdikten sonra, sistem uygulamanızın bağlamını kullanarak bekleyen niyeti çağırır.
2. Şekil. İç içe yerleştirilmiş bekleme amacı kullanılırken uygulamalar arası iletişim şeması.
Dolaylı intent alma
Uygulamanızın alabileceği örtülü amaçların reklamını yapmak üzere manifest dosyanızda <intent-filter>
öğesiyle birlikte uygulama bileşenlerinizin her biri için bir veya daha fazla intent filtresi tanımlayın.
Her intent filtresi, amacın işlemine, verilerine ve kategorisine göre kabul ettiği niyet türlerini belirtir. Sistem, yalnızca niyetin intent filtrelerinizden birinden geçebilmesi durumunda uygulama bileşeninize dolaylı bir niyet sağlar.
Not: Açık bir amaç, 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 beyan etmelidir. Örneğin, resim galerisi uygulamasındaki bir etkinliğin iki filtresi olabilir: bir resmi görüntülemek için bir filtre ve resmi düzenlemek için başka bir filtre. Etkinlik başladığında Intent
öğesini inceler ve Intent
içindeki bilgilere göre nasıl davranacağına (düzenleyici kontrollerinin gösterilip gösterilmeyeceğine) karar verir.
Her amaç filtresi, uygulamanın manifest dosyasında karşılık gelen uygulama bileşenine (<activity>
öğesi gibi) iç içe yerleştirilmiş bir <intent-filter>
öğesiyle tanımlanır.
<intent-filter>
öğesi içeren her uygulama bileşeninde, açık bir şekilde android:exported
için bir değer ayarlayın.
Bu özellik, uygulama bileşenine diğer uygulamaların erişip erişemeyeceğini ifade eder. Amaç filtreleri LAUNCHER
kategorisini içeren etkinlikler gibi bazı durumlarda, bu özelliği true
olarak ayarlamak yararlı olabilir. Aksi takdirde, bu özelliği false
olarak ayarlamak daha güvenli olur.
Uyarı: Uygulamanızdaki bir etkinlik, hizmet veya yayın alıcısı intent filtreleri kullanıyorsa ve android:exported
değerini açık bir şekilde 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 niyet türlerini belirtebilirsiniz:
<action>
name
özelliğinde kabul edilen amaç işlemini tanımlar. Değer, sınıf sabiti değil, işlemin dize değeri olmalıdır.<data>
- Veri URI'sinin (
scheme
,host
,port
,path
) ve MIME türünün çeşitli yönlerini belirten bir veya daha fazla özelliği kullanarak, kabul edilen veri türünü tanımlar. <category>
name
özelliğinde kabul edilen amaç kategorisini belirtir. Değer, bir işlemin sınıf sabiti değil, değişmez dize değeri olmalıdır.Not: Örtülü amaçları almak için intent filtresine
CATEGORY_DEFAULT
kategorisini eklemeniz gerekir.startActivity()
vestartActivityForResult()
yöntemleri, tüm amaçlarıCATEGORY_DEFAULT
kategorisini bildirmiş gibi ele alır. Niyet filtrenizde bu kategoriyi belirtmezseniz etkinliğiniz için hiçbir dolaylı intent çözümlenmez.
Örneğin, veri türü metin olduğunda ACTION_SEND
niyeti almak için amaç filtresi içeren bir etkinlik bildirimini burada görebilirsiniz:
<activity android:name="ShareActivity" android:exported="false"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Birden fazla <action>
, <data>
veya <category>
örneği içeren bir filtre oluşturabilirsiniz.
Bunu yaparsanız bileşenin, bu filtre öğelerinin tüm kombinasyonlarını işleyebileceğinden emin olmanız gerekir.
Birden çok amaç türünü, ancak yalnızca belirli eylem, veri ve kategori türü kombinasyonlarında işlemek istediğinizde, birden fazla amaç filtresi oluşturmanız gerekir.
Dolaylı intent, niyet üç öğenin her biriyle karşılaştırılarak bir filtreye karşı test edilir. Bileşene teslim edilmesi için amacın üç testten de geçmesi gerekir. Bunlardan birini bile eşleştiremezse Android sistemi, niyeti bileşene iletmez. Bununla birlikte, bir bileşenin birden fazla intent filtresi olabileceğinden, bileşenin filtrelerinden birinden geçmeyen bir amaç, başka bir filtreden geçebilir. Aşağıdaki Amaç Çözümlemesi bölümünde sistemin amaçları nasıl çözümlediğine dair daha fazla bilgi bulabilirsiniz.
Dikkat: Niyet filtresi kullanmak, diğer uygulamaların bileşenlerinizi başlatmasını önlemenin güvenli bir yolu değildir. Amaç filtreleri, bir bileşeni yalnızca belirli türlerdeki örtülü niyetlere yanıt verecek şekilde 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.
Bileşenlerinizden birini yalnızca kendi uygulamanızın başlatabilmesi önemliyse manifest'inizde intent filtreleri beyan etmeyin. 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şlatırken her zaman açık bir intent kullanın.
Not:
Tüm etkinlikler için intent filtrelerinizi manifest dosyasında beyan etmeniz gerekir.
Ancak yayın alıcıları filtreleri, registerReceiver()
çağrısı yapılarak dinamik bir şekilde kaydedilebilir. Ardından, alıcının unregisterReceiver()
kaydını iptal edebilirsiniz. Bu, uygulamanızın çalışırken yalnızca belirli bir süre boyunca belirli yayınları dinlemesine olanak tanır.
Örnek filtreler
Amaç filtresi davranışlarının bazılarını göstermek için bir sosyal paylaşım uygulamasının manifest dosyasından bir örneği burada bulabilirsiniz:
<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 ve herhangi bir amaç verisi beklemediğini belirtir.CATEGORY_LAUNCHER
kategorisi, bu etkinlik simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini belirtir.<activity>
öğesi,icon
içeren bir simge belirtmiyorsa sistem,<application>
öğesindeki simgeyi kullanır.
Etkinliğin uygulama başlatıcıda görünmesi için bu ikisi eşleştirilmelidir.
İkinci etkinlik olan ShareActivity
, metin ve medya içeriğinin paylaşımını kolaylaştırmak için tasarlanmıştır. Kullanıcılar bu etkinliğe MainActivity
uygulamasından gelerek girebilecek olsalar da, ShareActivity
özelliğini doğrudan iki amaç filtresinden biriyle eşleşen örtülü niyet yayınlayan başka bir uygulamadan da girebilirler.
Not: MIME türü (application/vnd.google.panorama360+jpg
), Google panorama API'leri ile işleyebileceğiniz, panorama fotoğraflarını belirten özel bir veri türüdür.
Amaçları diğer uygulamaların intent filtreleriyle eşleştirin
Başka bir uygulama, Android 13 (API düzeyi 33) veya sonraki sürümleri hedefliyorsa yalnızca amacınız diğer uygulamadaki bir <intent-filter>
öğesinin işlem ve kategorileriyle eşleşiyorsa uygulamanızın amacını işleyebilir. Sistem eşleşme bulamazsa ActivityNotFoundException
döndürür.
Gönderen uygulamanın bu istisnayı işlemesi gerekir.
Benzer şekilde, uygulamanızı Android 13 veya sonraki bir sürümü hedefleyecek şekilde güncellerseniz harici uygulamalardan gelen tüm amaçlar yalnızca uygulamanızın beyan ettiği <intent-filter>
öğesinin işlemleri ve kategorileriyle eşleşirse uygulamanızın dışa aktarılan bir bileşenine iletilir. Bu davranış, gönderen uygulamanın hedef SDK sürümünden bağımsız olarak gerçekleşir.
Aşağıdaki durumlarda, amaç eşleştirme zorunlu kılınmaz:
- Niyet filtresi beyan etmeyen bileşenlere yayınlanan amaçlar.
- Aynı uygulama içinden gelen amaçlar.
- Sistemden gelen amaçlar; yani, "sistem UID'sinden" (uid=1000) gönderilen amaçlar. Sistem uygulamaları,
system_server
veandroid:sharedUserId
değeriniandroid.uid.system
olarak ayarlayan uygulamaları içerir. - Kökten gelen amaçlar.
Amaç eşleştirme hakkında daha fazla bilgi edinin.
Beklemedeki bir amaç kullanılıyor
PendingIntent
nesnesi, Intent
nesnesinin etrafındaki sarmalayıcıdır. PendingIntent
öğesinin birincil amacı, yabancı bir uygulamaya, içerilen Intent
öğesini uygulamanızın kendi işleminden alınmış gibi kullanma izni vermektir.
Beklemedeki bir amacın başlıca kullanım alanları aşağıdakileri içerir:
- Kullanıcı, Bildiriminizle bir işlem gerçekleştirdiğinde yürütülecek bir niyet bildirme (Android sisteminin
NotificationManager
öğesi,Intent
işlemini yürütür). - Kullanıcı Uygulama Widget'ınızla (Ana ekran uygulaması
Intent
) bir işlem gerçekleştirdiğinde yürütülecek bir niyet belirtme. - Belirtilen gelecekte yürütülecek bir niyet bildirme (Android sisteminin
AlarmManager
işlevi,Intent
yürütür).
Her Intent
nesnesinin belirli bir uygulama bileşeni türü (Activity
, Service
veya BroadcastReceiver
) tarafından işlenecek şekilde tasarlanması gibi, PendingIntent
öğesi de aynı şekilde oluşturulmalıdır. Beklemedeki bir niyet kullanılırken uygulamanız startActivity()
gibi bir çağrıyla amacı yürütmez. Bunun yerine, PendingIntent
öğesini oluşturduğunuzda ilgili içerik oluşturucu yöntemini çağırarak hedeflenen bileşen türünü tanımlamanız gerekir:
Activity
başlayanIntent
içinPendingIntent.getActivity()
.Service
başlatanIntent
içinPendingIntent.getService()
.BroadcastReceiver
başlatanIntent
içinPendingIntent.getBroadcast()
.
Uygulamanız diğer uygulamalardan bekleyen niyet almıyorsa, PendingIntent
oluşturmak için yukarıdaki yöntemler muhtemelen ihtiyaç duyacağınız tek PendingIntent
yöntemidir.
Her yöntem; geçerli Context
uygulamasını, sarmalamak istediğiniz Intent
uygulamasını ve amacın nasıl kullanılması gerektiğini belirten bir veya daha fazla işareti (ör. amacın birden fazla kez kullanılıp kullanılamayacağı) alır.
Bekleyen amaçları kullanma hakkında daha fazla bilgi için Bildirimler ve Uygulama Widget'ları API kılavuzları gibi ilgili kullanım alanları ile ilgili belgeleri inceleyin.
Değişkenliği belirtin
Uygulamanız Android 12 veya sonraki bir sürümü hedefliyorsa uygulamanızın oluşturduğu her PendingIntent
nesnesinin değişkenliğini belirtmeniz gerekir. Belirli bir PendingIntent
nesnesinin değişken veya sabit olduğunu bildirmek için sırasıyla PendingIntent.FLAG_MUTABLE
veya PendingIntent.FLAG_IMMUTABLE
işaretini kullanın.
Uygulamanız değişkenlik işareti ayarlamadan PendingIntent
nesnesi oluşturmaya çalışırsa sistem bir IllegalArgumentException
gönderir ve Logcat'te aşağıdaki mesaj görünür:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
Mümkün olduğunda sabit bekleyen amaçlar oluşturun
Çoğu durumda uygulamanız, aşağıdaki kod snippet'inde gösterildiği gibi sabit PendingIntent
nesneleri oluşturmalıdır. PendingIntent
nesnesi sabitse diğer uygulamalar amacın çağrılmasının sonucunu ayarlamak için niyeti değiştiremez.
Kotlin
val pendingIntent = PendingIntent.getActivity(applicationContext, REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE);
Ancak bazı kullanım alanları için bunun yerine değişken PendingIntent
nesneleri gerekir:
- Bildirimlerde doğrudan yanıt işlemlerini destekleme. Doğrudan yanıt, yanıtla ilişkilendirilmiş PendingIntent nesnesindeki klip verilerinde değişiklik yapılmasını gerektirir. Genellikle bu değişikliği,
fillIn()
yöntemine işaret olarakFILL_IN_CLIP_DATA
ileterek talep edersiniz. CarAppExtender
örneklerini kullanarak bildirimleri Android Auto çerçevesiyle ilişkilendirme.- Görüşmeler,
PendingIntent
örnekleri kullanılarak balonlara yerleştiriliyor. DeğişebilirPendingIntent
nesnesi, 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 konum bilgilerini isteme. DeğişebilirPendingIntent
nesnesi, sistemin konum yaşam döngüsü olaylarını temsil eden amaç ekstraları eklemesine olanak tanır. Bu etkinlikler arasında konum değişikliği ve bir sağlayıcının kullanılabilir hale gelmesi yer alır.AlarmManager
ile alarm planlama. DeğişebilirPendingIntent
nesnesi, sisteminEXTRA_ALARM_COUNT
amaç ekstrasını eklemesine olanak tanır. Bu ekstra değer, yinelenen bir alarmın kaç kez tetiklendiğini gösterir. Amaç, bu fazladan değeri içeren bir uygulamaya, tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediğini (örneğin, cihaz uyku modundayken) doğru bir şekilde bildirebilir.
Uygulamanız değişken bir PendingIntent
nesnesi oluşturuyorsa açık niyet kullanmanız ve ComponentName
alanını doldurmanız önemle tavsiye edilir. Bu şekilde, başka bir uygulama PendingIntent
öğesini çağırıp kontrolü tekrar uygulamanıza aktardığında, uygulamanızdaki aynı bileşen her zaman başlar.
Beklemedeki amaçlar içinde açık intent'ler kullan
Diğer uygulamaların, uygulamanızın beklemedeki amaçlarını nasıl kullanabileceğini daha iyi tanımlamak için bekleyen niyeti her zaman açık niyetin etrafına sarmalayın. Bu en iyi uygulamadan yararlanmak için aşağıdakileri yapın:
- Temel amacın işlem, paket ve 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
aracını 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 birlikte güvenlik ve uyumluluk sağlayabilirsiniz:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
Amaç çözünürlüğü
Sistem bir etkinlik başlatmak için dolaylı bir niyet aldığında, bunu üç unsura göre intent filtreleriyle karşılaştırarak amaca en uygun etkinliği arar:
- İşlem.
- Veri (hem URI hem de veri türü).
- Kategori.
Aşağıdaki bölümlerde, bir uygulamanın manifest dosyasındaki intent filtresi bildirimine göre amaçların uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.
İşlem testi
Bir amaç filtresi, kabul edilen amaç işlemlerini belirtmek için aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <action>
öğesi tanımlayabilir:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
Bu filtreyi iletmek için Intent
içinde belirtilen işlemin filtrede listelenen işlemlerden biriyle eşleşmesi gerekir.
Filtrede herhangi bir işlem listelenmiyorsa niyetle eşleşecek bir şey yoktur. Bu nedenle tüm amaçlar testte başarısız olur. Bununla birlikte, Intent
bir işlem belirtmezse filtre en az bir işlem içerdiği sürece testi geçer.
Kategori testi
Bir amaç filtresi, kabul edilen amaç kategorilerini belirtmek için aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <category>
öğesi tanımlayabilir:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
Niyetin kategori testini geçebilmesi için Intent
içindeki her kategorinin filtredeki bir kategoriyle eşleşmesi gerekir. Tersi gerekli değildir. Amaç filtresi, Intent
içinde belirtilenden daha fazla kategori bildirebilir ve Intent
yine de geçer. Bu nedenle, herhangi bir kategorisi olmayan bir amaç, filtrede hangi kategorilerin tanımlandığına bakılmaksızın her zaman bu testten geçer.
Not:
Android, CATEGORY_DEFAULT
kategorisini startActivity()
ve startActivityForResult()
öğesine iletilen tüm örtülü amaçlara otomatik olarak 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"
ile ilgili bir kategori içermelidir.
Veri testi
Bir amaç filtresi, kabul edilen amaç verilerini belirtmek için aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <data>
öğesi tanımlayabilir:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
Her <data>
öğesi, bir URI yapısı ve veri türü (MIME medya türü) belirtebilir.
URI'nın her bölümü ayrı bir özelliktir: scheme
, host
, port
ve path
:
<scheme>://<host>:<port>/<path>
Aşağıdaki örnekte, bu özellikler için olası değerler gösterilmektedir:
content://com.example.project:200/folder/subfolder/etc
Bu URI'de şema content
, ana makine com.example.project
, bağlantı noktası 200
ve yol folder/subfolder/etc
şeklindedir.
Bu özelliklerden 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 belirtilmediyse bağlantı noktası yoksayılır.
- Hem şema hem de ana makine belirtilmezse yol yoksayılır.
Bir amaçtaki URI, bir filtredeki URI spesifikasyonuyla karşılaştırıldığında yalnızca URI'nın filtreye dahil edilen bölümleriyle karşılaştırılır. Örnek:
- Bir filtre yalnızca bir şemayı belirtiyorsa bu şemaya sahip tüm URI'ler filtreyle eşleşir.
- Bir filtre bir şema ve bir yetki belirtir ancak yolu belirtmezse aynı şema ve yetkiliye sahip tüm URI'lar, yolları ne olursa olsun filtreyi geçirir.
- Bir filtre bir şema, yetki ve yol belirtiyorsa yalnızca aynı şema, yetki ve yola sahip URI'lar filtreyi geçirir.
Not: Bir yol spesifikasyonu, yol adının yalnızca kısmi bir eşleşmesini gerektirecek şekilde bir joker karakter (*) içerebilir.
Veri testi, niyetteki URI ve MIME türünü filtrede belirtilen bir URI ve MIME türüyle karşılaştırır. Kurallar aşağıdaki gibidir:
- URI veya MIME türü içermeyen bir niyet, yalnızca filtre herhangi bir URI veya MIME türü belirtmiyorsa testi geçer.
- URI içeren ancak MIME türü içermeyen bir niyet (ne açık veya URI'dan çıkarılamaz) testi yalnızca URI'sının filtrenin URI biçimiyle eşleşmesi ve filtrenin de aynı şekilde bir MIME türü belirtmemesi durumunda geçer.
- MIME türü içeren ancak URI içermeyen bir niyet, 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'dan çıkarılabilir) içeren bir niyet, yalnızca bu türün filtrede listelenen bir türle eşleşmesi durumunda testin MIME türü kısmını geçer. URI'sı filtredeki bir URI ile eşleşiyorsa veya
content:
ya dafile:
URI'sına sahipse ve filtre bir URI belirtmiyorsa testin URI bölümünü geçirir. Başka bir deyişle, filtresinde yalnızca bir MIME türü listeleyen bileşenincontent:
vefile:
verilerini desteklediği varsayılır.
Not: Niyet, URI veya MIME türünü belirtiyorsa <intent-filter>
içinde <data>
öğesi yoksa veri testi başarısız olur.
Bu son kural (d) kuralı, bileşenlerin bir dosyadan veya içerik sağlayıcıdan yerel verileri alabilme beklentisini yansıtır.
Bu nedenle, filtreleri yalnızca bir veri türünü listeleyebilir ve content:
ve file:
şemalarını açıkça adlandırmaları gerekmez.
Aşağıdaki örnekte, bir <data>
öğesinin Android'e bileşenin bir içerik sağlayıcıdan resim verileri alabileceğini ve gösterebileceğini bildirdiği tipik bir durum gösterilmektedir:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
Veri türünü belirtip URI içermeyen filtreler, belki de en yaygın filtrelerdir, çünkü kullanılabilir verilerin çoğu içerik sağlayıcıları tarafından dağıtılmaktadır.
Yaygın olarak kullanılan diğer bir yapılandırma da şema ve veri türü içeren bir filtredir. Örneğin, aşağıdaki gibi bir <data>
öğesi Android'e, bileşenin işlemi gerçekleştirmek için ağdan video verileri alabileceğini bildirir:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Amaç eşleştirme
Amaçlar, yalnızca etkinleştirilecek hedef bileşeni bulmak için değil, aynı zamanda cihazdaki bileşen grubu hakkında bir şeyler keşfetmek için de amaç filtreleriyle eşleştirilir. Örneğin, Home uygulaması ACTION_MAIN
işlemini ve CATEGORY_LAUNCHER
kategorisini belirten intent filtrelerine sahip tüm etkinlikleri bularak uygulama başlatıcıyı doldurur.
IntentFilter
sınıfının dokümanlarında açıklandığı gibi, yalnızca Intent'teki eylemler ve kategoriler filtreyle eşleşirse eşleşme başarılı olur.
Uygulamanız, Home uygulamasının işlevine benzer bir şekilde amaç eşleştirmeyi kullanabilir.
PackageManager
, belirli bir amacı kabul edebilen tüm bileşenleri döndüren bir query...()
yöntem grubuna ve bir amaca yanıt verecek en iyi bileşeni belirleyen benzer resolve...()
yöntemlerine sahiptir. Örneğin, queryIntentActivities()
, bağımsız değişken olarak aktarılan niyeti gerçekleştirebilecek tüm etkinliklerin listesini ve queryIntentServices()
, benzer bir hizmet listesi döndürür.
İki yöntem de bileşenleri etkinleştirmez; yalnızca yanıt verebilenleri listeler. Yayın alıcıları için
queryBroadcastReceivers()
adlı benzer bir yöntem vardır.