Intent
, başka bir uygulama bileşeninden işlem istemek için kullanabileceğiniz bir mesajlaşma nesnesidir.
Amaçlar bileşenler arasındaki iletişimi çeşitli şekillerde kolaylaştırsa da başlıca üç kullanım alanı vardır:
- Etkinlik başlatma
Activity
, uygulamadaki tek bir ekranı temsil eder.startActivity()
öğesineIntent
ileterek yeni birActivity
örneği başlatabilirsiniz.Intent
, başlayacak etkinliği açıklar ve gerekli tüm verileri taşır.Tamamlandığında etkinlikten bir sonuç almak istiyorsanız
startActivityForResult()
işlevini çağırın. Etkinliğiniz, sonucu etkinliğinizinonActivityResult()
geri çağırmasında 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 hizmet başlatabilirsiniz.JobScheduler
hakkında daha fazla bilgi içinAPI-reference documentation
öğesine göz atın.Android 5.0'dan (API düzeyi 21) önceki sürümlerde
Service
sınıfının yöntemlerini kullanarak bir hizmeti başlatabilirsiniz.startService()
öğesineIntent
ileterek tek seferlik bir işlem (ör. dosya indirme) yapmak için bir hizmet başlatabilirsiniz.Intent
, hizmetin başlatılacağını açıklar ve gerekli tüm verileri taşır.Hizmet bir istemci-sunucu arayüzüyle tasarlanmışsa
bindService()
öğesineIntent
ileterek başka bir bileşenden hizmete bağlayabilirsiniz. Daha fazla bilgi için Hizmetler kılavuzuna bakın. - Yayın yapma
Anons, tüm uygulamaların alabileceği mesajdır. Sistem, sistemin başlatılması veya cihazın şarj olmaya başlaması gibi sistem etkinlikleri için çeşitli yayınlar sunar.
sendBroadcast()
veyasendOrderedBroadcast()
cihazınaIntent
ileterek diğer uygulamalara yayın gönderebilirsiniz.
Bu sayfanın geri kalanında, amaçların işleyiş şekli ve nasıl kullanılacağı açıklanmaktadır. İlgili bilgiler için Diğer Uygulamalarla Etkileşimde Bulunma ve İçerik Paylaşma konularına bakın.
Amaç türleri
İki tür amaç vardır:
- Belirgin amaçlar, tam
ComponentName
belirterek hangi uygulamanın amacı yerine getireceğini belirtir. Başlamak istediğiniz etkinliğin veya hizmetin sınıf adını bildiğinizden, kendi uygulamanızda bir bileşeni başlatmak için genellikle açık bir intent kullanırsınız. Örneğin, bir kullanıcı işlemine yanıt olarak uygulamanızda yeni bir etkinlik başlatabilir veya arka planda dosya indirmek için bir hizmet başlatabilirsiniz. - Dolaylı niyetler, belirli bir bileşeni adlandırmaz ancak bunun yerine, başka bir uygulamadaki bileşenin onu işlemesine olanak tanıyan genel bir işlem bildirir. Örneğin, kullanıcıya harita üzerinde bir konum göstermek istiyorsanız örtülü bir intent kullanarak başka bir uygulamanın haritada belirli bir konumu göstermesini isteyebilirsiniz.
Şekil 1'de, etkinlik başlatılırken amacın nasıl kullanıldığı gösterilmektedir. Intent
nesnesi belirli bir etkinlik bileşenini açıkça adlandırdığında sistem bu bileşeni hemen başlatır.
![](https://developer.android.com/static/images/components/intent-filters_2x.png?authuser=5&hl=tr)
Şekil 1. Başka bir etkinlik başlatmak için örtülü bir niyetin sistem üzerinden nasıl sağlandığı: [1] A Etkinliği, işlem açıklaması içeren bir Intent
oluşturur ve bunu startActivity()
öğesine iletir. [2] Android Sistemi, amaçla eşleşen bir intent filtresi bulmak için tüm uygulamalarda arama yapar. Bir eşleşme bulunduğunda [3] sistem, onCreate()
yöntemini çağırıp Intent
öğesini ileterek eşleşme etkinliğini (B Etkinliği) başlatır.
Dolaylı bir intent kullandığınızda Android sistemi, amacın içeriğini cihazdaki diğer uygulamaların manifest dosyasında tanımlanan amaç filtreleriyle karşılaştırarak başlamak için uygun bileşeni bulur. Amaç bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve Intent
nesnesini yayınlar. Birden fazla intent filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebileceği bir iletişim kutusu gösterir.
Intent filtresi, bir uygulamanın manifest dosyasında bulunan ve bileşenin almak istediği amaçların türünü belirten bir ifadedir. Örneğin, bir etkinlik için intent filtresi tanımlayarak diğer uygulamaların etkinliğinizi belirli bir amaçla doğrudan başlatmasını sağlarsınız. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz etkinlik yalnızca açık bir amaçla başlatılabilir.
Dikkat: Uygulamanızın güvenli olduğundan emin olmak için Service
başlatırken her zaman açık bir amaç kullanın ve hizmetleriniz için amaç filtreleri beyan etmeyin. Bir hizmeti başlatmak için örtülü niyet kullanmak, güvenlik açısından tehlike arz eder. Çünkü amaca yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başladığını göremez. Android 5.0 (API düzeyi 21) sürümünden itibaren, bindService()
öğesini örtülü bir niyetle çağırırsanız sistem bir istisna atar.
Amaç oluşturma
Intent
nesnesi, Android sisteminin hangi bileşenin başlatılacağını belirlemek için kullandığı bilgilerin (amacı alması gereken tam bileşen adı veya bileşen kategorisi gibi) yanı sıra, alıcı bileşenin işlemi düzgün bir şekilde gerçekleştirmek için kullandığı bilgileri (yapılacak işlem ve üzerinde işlem yapılacak veriler gibi) taşır.
Intent
içinde yer alan temel bilgiler şunlardır:
- Bileşen adı
- Başlatılacak bileşenin adı.
Bu, isteğe bağlıdır ancak bir amacı açık hale getiren önemli bir bilgidir. Diğer bir deyişle, amacın yalnızca bileşen adıyla tanımlanan uygulama bileşenine iletilmesi gerekir. Bileşen adı olmadığında amaç dolaylı olur ve sistem, diğer amaç bilgilerine (aşağıda açıklanan işlem, veri ve kategori gibi) dayanarak niyeti hangi bileşenin alacağına karar verir. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa bileşen adını belirtmelisiniz.
Not:
Service
öğesini başlatırken her zaman bileşen adını belirtin. Aksi takdirde, hangi hizmetin amaca yanıt vereceğinden emin olamazsınız ve kullanıcı hangi hizmetin başlatıldığını göremez.Intent
öğesinin bu alanı, uygulamanın paket adı da dahil olmak üzere (com.example.ExampleActivity
gibi) hedef bileşenin tam nitelikli sınıf adını kullanarak belirtebileceğiniz birComponentName
nesnesidir. Bileşen adınısetComponent()
,setClass()
,setClassName()
veyaIntent
oluşturucuyla ayarlayabilirsiniz. - İşlem
- Gerçekleştirilecek genel işlemi belirten bir dize (ör. görüntüleme veya seç).
Yayın amacı söz konusu olduğunda bu, gerçekleşen ve bildirilen işlemdir. İşlem, büyük ölçüde niyetin geri kalanının nasıl yapılandırılacağını, özellikle de verilerde ve ekstra özelliklerde yer alan bilgileri belirler.
Uygulamanızdaki amaçlar tarafından (veya uygulamanızdaki bileşenleri çağırmak için diğer uygulamalar tarafından) kullanılmak üzere kendi işlemlerinizi belirtebilirsiniz. Ancak, genellikle
Intent
sınıfı veya diğer çerçeve sınıfları tarafından tanımlanan işlem sabitleri belirtebilirsiniz. Bir etkinlik başlatmak için yapılan yaygın işlemlerden bazıları şunlardır:ACTION_VIEW
- Bir etkinliğin kullanıcıya gösterebileceği bazı bilgilere (ör. galeri uygulamasında görüntülenecek bir fotoğraf veya harita uygulamasında görüntülenecek bir adres) sahip olduğunuzda bu işlemi
startActivity()
ile niyette kullanın. ACTION_SEND
- Paylaşım amacı olarak da bilinen bu özelliği, kullanıcının e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabileceği bazı verileriniz olduğunda
startActivity()
ile niyette kullanmalısınız.
Genel işlemleri tanımlayan diğer sabit değerler için
Intent
sınıf referansına bakın. Diğer işlemler, Android çerçevesinin başka bir yerinde (ör. sistemin Ayarlar uygulamasında belirli ekranları açan işlemler içinSettings
içinde) tanımlanır.Bir amaca yönelik işlemi
setAction()
veya birIntent
oluşturucuyla belirtebilirsiniz.Kendi işlemlerinizi tanımlarsanız aşağıdaki örnekte gösterildiği gibi, uygulamanızın paket adını bir önek olarak eklediğinizden emin olun:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- Veri
- Üzerinde işlem yapılacak verilere başvuruda bulunan URI (bir
Uri
nesnesi) ve/veya bu verilerin MIME türü. Sağlanan verilerin türü genellikle niyetin işlemine göre belirlenir. Örneğin, işlemACTION_EDIT
ise veriler düzenlenecek dokümanın URI'sını içermelidir.Bir amaç oluştururken, URI'ya ek olarak veri türünü (MIME türü) belirtmek genellikle önemlidir. Örneğin, URI biçimleri benzer olsa bile, resimleri görüntüleyebilen bir etkinlik muhtemelen ses dosyası çalamaz. Verilerinizin MIME türünü belirtmeniz, Android sisteminin amacınızı alacak en iyi bileşeni bulmasına yardımcı olur. Ancak, özellikle de veriler bir
content:
URI'si olduğunda, MIME türü bazen URI'den çıkarılabilir.content:
URI, verilerin cihazda bulunduğunu ve veri MIME türünü sisteme görünür hale getiren birContentProvider
tarafından kontrol edildiğini gösterir.Yalnızca veri URI'sini ayarlamak için
setData()
yöntemini çağırın. Yalnızca MIME türünü ayarlamak içinsetType()
yöntemini çağırın. Gerekirse her ikisini desetDataAndType()
ile açıkça ayarlayabilirsiniz.Dikkat: Hem URI hem de MIME türünü ayarlamak istiyorsanız her biri diğerinin değerini geçersiz kılacağından
setData()
vesetType()
çağrılarını yapmayın. Hem URI hem de MIME türünü ayarlamak için her zamansetDataAndType()
kullanın. - Kategori
- Amacı işlemesi gereken bileşenin türü hakkında ek bilgileri içeren bir dize. Amaca istediğiniz kadar kategori açıklaması yerleştirilebilir, ancak çoğu amaç bir kategori gerektirmez.
Sık karşılaşılan kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE
- Hedef etkinlik, bir bağlantının başvurduğu resim veya e-posta mesajı gibi verilerin görüntülenmesi için bir web tarayıcısı tarafından başlatılmasına izin verir.
CATEGORY_LAUNCHER
- Etkinlik, bir görevin ilk etkinliğidir ve sistemin uygulama başlatıcısında listelenir.
Kategorilerin tam listesi için
Intent
sınıf açıklamasına bakın.addCategory()
ile kategori belirtebilirsiniz.
Yukarıda listelenen bu özellikler (bileşen adı, işlem, veri ve kategori) bir amacın tanımlayıcı özelliklerini temsil eder. Android sistemi bu özellikleri okuyarak, hangi uygulama bileşenini başlatması gerektiğini çözebilir. Ancak niyet, uygulama bileşenine çözümlenme şeklini etkilemeyen ek bilgiler içerebilir. Niyet, aşağıdaki bilgileri de sağlayabilir:
- Ekstralar
- İstenen işlemi gerçekleştirmek için gereken ek bilgileri içeren anahtar/değer çiftleri.
Bazı eylemler belirli türde veri URI'ları kullandığı gibi, bazı işlemler de belirli ekstraları kullanır.
Her biri anahtar adı ve değer olmak üzere iki parametreyi kabul eden çeşitli
putExtra()
yöntemleriyle ekstra veriler ekleyebilirsiniz. Ayrıca, tüm ek verileri içeren birBundle
nesnesi oluşturabilir ve ardındanBundle
öğesiniputExtras()
ileIntent
içine ekleyebilirsiniz.Örneğin,
ACTION_SEND
ile e-posta göndermek için niyet oluştururken Alıcı alıcısınıEXTRA_EMAIL
anahtarıyla, konuyu iseEXTRA_SUBJECT
anahtarıyla belirtebilirsiniz.Intent
sınıfı, standartlaştırılmış veri türleri için birçokEXTRA_*
sabiti belirtir. Kendi ek anahtarlarınızı tanımlamanız gerekiyorsa (uygulamanızın aldığı amaçlar için) aşağıdaki örnekte gösterildiği gibi uygulamanızın paket adını önek olarak eklediğinizden emin olun:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Dikkat: Başka bir uygulamanın almasını beklediğiniz bir intent gönderirken
Parcelable
veyaSerializable
verilerini kullanmayın. Bir uygulama,Bundle
nesnesindeki verilere erişmeye çalışır ancak ayrıştırılmış veya serileştirilmiş sınıfa erişimi yoksa sistem birRuntimeException
oluşturur. - İşaretler
- İşaretler,
Intent
sınıfında tanımlanmış ve amaç için meta veri işlevi görür. İşaretler, Android sistemine bir etkinliğin nasıl başlatılacağını (örneğin, etkinliğin hangi göreve ait olması gerektiği) ve başlatıldıktan sonra nasıl işleneceğini (örneğin, son etkinlikler listesinde olup olmadığı) yollayabilir.Daha fazla bilgi için
setFlags()
yöntemine bakın.
Uygunsuz amaç örneği
Açık intent, uygulamanızdaki belirli bir etkinlik veya hizmet gibi belirli bir uygulama bileşenini başlatmak için kullandığınız yöntemdir. Açık bir amaç oluşturmak için Intent
nesnesinin bileşen adını tanımlayın. Diğer tüm intent özellikleri isteğe bağlıdır.
Örneğin, uygulamanızda web'den dosya indirmek için tasarlanmış DownloadService
adlı bir hizmet oluşturduysanız bu hizmeti şu kodla başlatabilirsiniz:
Kotlin
// Executed in an Activity, so 'this' is 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, uygulama Context
ve bileşene bir Class
nesnesi sağlar. Dolayısıyla bu amaç, uygulamada açıkça DownloadService
sınıfını başlatır.
Hizmet oluşturma ve başlatma hakkında daha fazla bilgi için Hizmetler kılavuzuna bakın.
Örtülü amaç örneği
Dolaylı intent, cihazdaki herhangi bir uygulamayı çağırabilen işlemi belirtir. Dolaylı intent, uygulamanız işlemi gerçekleştiremediğinde faydalıdır, ancak diğer uygulamalar muhtemelen bunu yapabiliyor ve kullanıcının hangi uygulamayı kullanacağını seçmesini istiyorsanız.
Örneğin, kullanıcının diğer kullanıcılarla paylaşmasını istediğiniz bir içeriğiniz varsa ACTION_SEND
işlemiyle bir amaç oluşturun ve paylaşılacak içeriği belirten ekstra özellikler ekleyin. Bu amaçla startActivity()
uygulamasını aradığınızda kullanıcı, içeriği paylaşacağı bir uygulama seçebilir.
Kotlin
// Create the text message with a string. val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Try to invoke the intent. try { startActivity(sendIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
startActivity()
çağrıldığında, sistem hangi uygulamaların bu tür bir niyeti (ACTION_SEND
işlemi içeren ve "metin/düz" verileri taşıyan niyet) işleyebildiğini belirlemek için tüm yüklü uygulamaları inceler. Bunu işleyebilecek yalnızca bir uygulama varsa o uygulama hemen açılır ve kendisine niyeti verilir. Başka hiçbir uygulama bunu işleyemezse uygulamanız gerçekleşen ActivityNotFoundException
aktarmasını yakalayabilir. Amacı birden fazla etkinlik kabul ederse sistem, Şekil 2'de gösterilene benzer bir iletişim kutusu görüntüler. Böylece, kullanıcı hangi uygulamayı kullanacağını seçebilir.
Diğer uygulamaların başlatılmasıyla ilgili daha fazla bilgiyi, kullanıcıyı başka bir uygulamaya gönderme ile ilgili kılavuzda bulabilirsiniz.
![](https://developer.android.com/static/images/training/basics/intent-chooser.png?authuser=5&hl=tr)
Şekil 2. Seçici iletişim kutusu.
Uygulama seçiciyi zorunlu kılma
Dolaylı amacınıza yanıt veren birden fazla uygulama olduğunda, kullanıcı hangi uygulamanın kullanılacağını seçebilir ve o uygulamayı işlem için varsayılan seçim yapabilir. Kullanıcının her zaman aynı uygulamayı kullanmak isteyeceği bir işlem gerçekleştirirken (ör. bir web sayfasını açarken) varsayılan seçim olanağı faydalı olur (kullanıcılar genellikle yalnızca bir web tarayıcısını tercih eder).
Bununla birlikte, birden fazla uygulama amaca yanıt verebiliyorsa ve kullanıcı her seferinde farklı bir uygulama kullanmak isteyebiliyorsa açık bir şekilde bir seçici iletişim kutusu göstermeniz gerekir. Seçici iletişim kutusu, kullanıcıdan işlem için hangi uygulamanın kullanılacağını seçmesini ister (kullanıcı işlem için varsayılan bir uygulama seçemez). Örneğin, uygulamanız ACTION_SEND
işlemini "paylaştığında", kullanıcılar mevcut durumlarına bağlı olarak farklı bir uygulama kullanarak paylaşımda bulunmak isteyebilir. Bu nedenle, her zaman Şekil 2'de gösterildiği gibi seçici iletişim kutusunu kullanmanız gerekir.
Seçiciyi göstermek için createChooser()
kullanarak bir Intent
oluşturun ve aşağıdaki örnekte gösterildiği gibi startActivity()
öğesine iletin.
Bu örnekte, createChooser()
yöntemine aktarılan amaca yanıt veren uygulamaların listesinin yer aldığı bir iletişim kutusu gösterilir ve iletişim kutusu başlığı olarak sağlanan metni kullanır.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) ... // Always use string resources for UI text. // This says something like "Share this photo with" val title: String = resources.getString(R.string.chooser_title) // Create intent to show the chooser dialog val chooser: Intent = Intent.createChooser(sendIntent, title) // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(chooser) }
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
Güvenli olmayan intent başlatmalarını tespit edin
Uygulamanız, uygulamanızdaki bileşenler arasında gezinmek veya başka bir uygulama adına işlem gerçekleştirmek için niyetler başlatabilir. Android 12 (API düzeyi 31) ve sonraki sürümler, uygulamanızda güvenli olmayan bir amaç başlatma işlemi gerçekleştirirse sizi uyaran bir hata ayıklama özelliği sunarak platform güvenliğini iyileştirebilir. Örneğin, uygulamanız iç içe yerleştirilmiş bir niyetin güvenli olmayan bir şekilde başlatılmasını gerçekleştirebilir. Bu, başka bir amaçta fazladan olarak aktarılan bir amaçtır.
Uygulamanız aşağıdaki işlemlerin ikisini de gerçekleştirirse sistem, güvenli olmayan bir niyetin başlatılmasını algılar ve StrictMode ihlali gerçekleşir:
- Uygulamanız, iç içe yerleştirilmiş bir niyeti, teslim edilen bir niyetin ekstralarından ayrıştırıyor.
- Uygulamanız, iç içe yerleştirilmiş amacı kullanarak amacı hemen
startActivity()
,startService()
veyabindService()
öğesine iletme gibi bir uygulama bileşeni başlatır.
Bu durumu nasıl tanımlayacağınız ve uygulamanızda değişiklik yapacağınız konusunda daha fazla bilgi için Medium'da Android Nesting Intents ile ilgili blog yayınını okuyun.
Güvenli olmayan intent başlatma olup olmadığını kontrol etme
Uygulamanızda güvenli olmayan intent başlatma olup olmadığını kontrol etmek için VmPolicy
öğenizi yapılandırırken aşağıdaki kod snippet'inde gösterildiği gibi detectUnsafeIntentLaunch()
çağrısı yapın. Uygulamanız bir StrictMode ihlali algılarsa, hassas olabilecek bilgileri korumak için uygulamanın yürütülmesini durdurmak isteyebilirsiniz.
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()) }
Java
protected void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()); }
Amaçları daha sorumlu bir şekilde kullanın
Güvenli olmayan intent başlatma ve StrictMode ihlali ihtimalini en aza indirmek için bu en iyi uygulamaları izleyin.
Amaçlardaki yalnızca önemli ekstraları kopyalayın ve gerekli tüm sağlık ve doğrulama işlemlerini yapın. Uygulamanız, ekstraları bir amaçtan, yeni bir bileşeni başlatmak için kullanılan başka bir amaca kopyalayabilir. Bu işlem, uygulamanız putExtras(Intent)
veya putExtras(Bundle)
çağırdığında gerçekleşir.
Uygulamanız bu işlemlerden birini gerçekleştirirse yalnızca alıcı bileşenin beklediği ekstraları kopyalayın. Diğer amaç (kopyayı alan) dışa aktarılmayan bir bileşeni başlatırsa bileşeni başlatan amaca kopyalamadan önce ekstraları temizleyip doğrulayın.
Uygulamanızın bileşenlerini gereksiz yere dışa aktarmayın. Örneğin, iç içe yerleştirilmiş bir intent kullanarak bir uygulama bileşenini başlatmak istiyorsanız bileşenin android:exported
özelliğini false
olarak ayarlayın.
İç içe yerleştirilmiş intent yerine PendingIntent
kullanın. Bu şekilde, başka bir uygulama, Intent
içeren PendingIntent
öğesini ayrıştırdığında, diğer uygulama uygulamanızın kimliğini kullanarak PendingIntent
öğesini başlatabilir. Bu yapılandırma, diğer uygulamanın uygulamanızda, dışa aktarılmayan bileşenler de dahil olmak üzere herhangi bir bileşeni güvenli bir şekilde başlatmasına olanak tanır.
Şekil 2'deki şemada, sistemin kontrolü (istemci) uygulamanızdan başka bir (hizmet) uygulamasına ve ardından sizin uygulamanıza nasıl geri gönderdiği gösterilmektedir:
- Uygulamanız, başka bir uygulamadaki etkinliği çağıran bir intent oluşturuyor. Bu niyete ekstra olarak bir
PendingIntent
nesnesi eklersiniz. Bu beklemedeki amaç, uygulamanızdaki bir bileşeni çağırır; bu bileşen dışa aktarılmaz. - 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ü uygulamanıza geri ilettikten sonra sistem, uygulamanızın bağlamını kullanarak beklemedeki niyeti çağırır.
Şekil 2. İç içe bekleyen bir amaç kullanılırken uygulamalar arası iletişim şeması.
Dolaylı intent alma
Uygulamanızın hangi örtülü amaçları alabileceğinin reklamını yapmak için manifest dosyanızda uygulama bileşenlerinizin her biri için bir veya daha fazla intent filtresi <intent-filter>
öğesi ile bildirin.
Her intent filtresi, amacın işlemine, verilerine ve kategorisine göre kabul ettiği niyet türlerini belirtir. Sistem, yalnızca niyetin, intent filtrelerinizden birini geçebilmesi durumunda uygulama bileşeninize örtülü bir intent sunar.
Not: Bileşenin bildirdiği intent filtrelerinden bağımsız olarak, açık bir amaç her zaman hedefine iletilir.
Bir uygulama bileşeni, yapabileceği her benzersiz iş için ayrı filtreler beyan etmelidir.
Örneğin, bir resim galerisi uygulamasındaki bir etkinliğin iki filtresi olabilir: Bir resmi görüntülemek için filtre, resmi düzenlemek için başka bir filtre. Etkinlik başladığında Intent
öğesini inceler ve Intent
içindeki bilgilere dayanarak nasıl davranılacağına (düzenleyici kontrollerini gösterip göstermeme gibi) karar verir.
Her intent filtresi, uygulamanın manifest dosyasında, karşılık gelen uygulama bileşenine (ör. <activity>
öğesi) yerleştirilmiş bir <intent-filter>
öğesiyle tanımlanır.
<intent-filter>
öğesi içeren her uygulama bileşeninde, android:exported
için açıkça bir değer ayarlayın.
Bu özellik, uygulama bileşenine diğer uygulamaların erişip erişemeyeceğini belirtir. Amaç filtreleri LAUNCHER
kategorisini içeren etkinlikler gibi bazı durumlarda, bu özelliğin true
olarak ayarlanması yararlı olur. Aksi takdirde, bu özelliği false
olarak ayarlamak daha güvenlidir.
Uyarı: Uygulamanızdaki bir etkinlik, hizmet veya yayın alıcı, intent filtrelerini kullanıyorsa ve android:exported
için değeri açıkça ayarlamazsa uygulamanız Android 12 veya sonraki sürümleri çalıştıran bir cihaza yüklenemez.
<intent-filter>
içinde, şu üç öğeden birini veya daha fazlasını kullanarak kabul edilecek niyet türlerini belirtebilirsiniz:
<action>
- Kabul edilen intent işlemini
name
özelliğinde belirtir. Değer, sınıf sabiti değil, işlemin düz dize değeri olmalıdır. <data>
- Veri URI'sinin (
scheme
,host
,port
,path
) ve MIME türünün çeşitli yönlerini belirten bir veya daha fazla özelliği kullanarak kabul edilen veri türünü tanımlar. <category>
- Kabul edilen amaç kategorisini
name
özelliğinde belirtir. Değer, sınıf sabiti değil, işlemin düz dize değeri olmalıdır.Not: Dolaylı intent almak için amaç filtresine
CATEGORY_DEFAULT
kategorisini eklemeniz gerekir.startActivity()
vestartActivityForResult()
yöntemleri, tüm amaçlarıCATEGORY_DEFAULT
kategorisini açıklamış gibi ele alır. Amaç filtrenizde bu kategoriyi bildirmezseniz hiçbir örtülü niyet, etkinliğiniz için çözümlenmez.
Örneğin, veri türü metin olduğunda ACTION_SEND
niyetini almak için intent filtresi içeren bir etkinlik beyanını aşağıda görebilirsiniz:
<activity android:name="ShareActivity" android:exported="false"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Birden fazla <action>
, <data>
veya <category>
örneğini içeren bir filtre oluşturabilirsiniz.
Bunu yaparsanız bileşenin bu filtre öğelerinin herhangi bir kombinasyonunu veya tüm kombinasyonlarını işleyebileceğinden emin olmanız gerekir.
Birden çok amaç türünü yalnızca belirli eylem, veri ve kategori türü kombinasyonlarıyla ele almak istiyorsanız birden fazla intent filtresi oluşturmanız gerekir.
Örtülü niyet, amaç üç öğenin her biriyle karşılaştırılarak bir filtreye karşı test edilir. Amacın, bileşene yayınlanması için üç testten de geçmesi gerekir. Bunlardan biriyle bile eşleşemezse Android sistemi, amacı bileşene iletmez. Bununla birlikte, bir bileşende birden fazla intent filtresi olabileceğinden bileşenin filtrelerinden birinden geçmeyen bir intent, başka bir filtreden geçebilir. Sistemin amaçları nasıl çözümlediği hakkında daha fazla bilgi için aşağıdaki Amaç Çözümü bölümüne bakın.
Dikkat: Amaç filtresi kullanmak, diğer uygulamaların bileşenlerinizi başlatmasını engellemenin güvenli bir yolu değildir. Amaç filtreleri bir bileşeni yalnızca belirli örtülü niyet türlerine yanıt verecek şekilde kısıtlasa da başka bir uygulama, bileşen adlarınızı geliştirici belirlerse açık bir amaç kullanarak uygulama bileşeninizi başlatabilir.
Bileşenlerinizden birini yalnızca kendi uygulamanızın başlatabilmesi önemliyse manifest dosyanızda amaç filtrelerini bildirmeyin. Bunun yerine, bileşen için exported
özelliğini "false"
olarak ayarlayın.
Benzer şekilde, yanlışlıkla farklı bir uygulamanın Service
öğesini çalıştırmamak için kendi hizmetinizi başlatmak üzere her zaman açık bir intent kullanın.
Not:
Tüm etkinlikler için intent filtrelerinizi manifest dosyasında bildirmeniz gerekir.
Ancak yayın alıcıları için filtreler, registerReceiver()
çağrısı yapılarak dinamik olarak kaydedilebilir. Ardından, alıcının unregisterReceiver()
kaydını iptal edebilirsiniz. Bu sayede uygulamanız, uygulamanız çalışırken yalnızca belirli bir süre boyunca belirli yayınları dinleyebilir.
Örnek filtreler
Amaç filtresi davranışlarından bazılarını göstermek için bir sosyal paylaşım uygulamasının manifest dosyasından bir örnek aşağıda verilmiştir:
<activity android:name="MainActivity" android:exported="true"> <!-- This activity is the main entry, should appear in app launcher --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ShareActivity" android:exported="false"> <!-- This activity handles "SEND" actions with text data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <action android:name="android.intent.action.SEND_MULTIPLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.google.panorama360+jpg"/> <data android:mimeType="image/*"/> <data android:mimeType="video/*"/> </intent-filter> </activity>
İlk etkinlik (MainActivity
), uygulamanın ana giriş noktasıdır. Kullanıcı, uygulamayı başlatıcı simgesiyle ilk kez başlattığında açılan etkinlik:
ACTION_MAIN
işlemi, bunun ana giriş noktası olduğunu belirtir ve herhangi bir intent verisi beklemez.CATEGORY_LAUNCHER
kategorisi, bu etkinlik simgesinin sistemin uygulama başlatıcısına yerleştirilmesi gerektiğini belirtir.<activity>
öğesiicon
ile bir simge belirtmiyorsa sistem,<application>
öğesindeki simgeyi kullanır.
Etkinliğin uygulama başlatıcıda görünmesi için bu ikisinin birbiriyle eşlenmesi gerekir.
İkinci etkinlik olan ShareActivity
'ın amacı, metin ve medya içeriğinin paylaşımını kolaylaştırmaktır. Kullanıcılar bu etkinliğe MainActivity
üzerinden giderek bu etkinliğe girebilse de doğrudan, iki intent filtresinden biriyle eşleşen örtülü niyet sunan başka bir uygulamadan da ShareActivity
girebilirler.
Not: MIME türü (application/vnd.google.panorama360+jpg
), Google panorama API'leri ile işleyebileceğiniz panorama fotoğrafları belirten özel bir veri türüdür.
Amaçları diğer uygulamaların intent filtreleriyle eşleştirme
Android 13 (API düzeyi 33) veya sonraki sürümleri hedefleyen başka bir uygulama, yalnızca amacınızın diğer uygulamadaki bir <intent-filter>
öğesinin işlemleri ve kategorileriyle eşleşmesi durumunda uygulamanızın amacını işleyebilir. Sistem bir eşleşme bulamazsa ActivityNotFoundException
atar.
Gönderen uygulama bu istisnayı işlemelidir.
Benzer şekilde, uygulamanızı Android 13 veya sonraki bir sürümü hedefleyecek şekilde güncellerseniz harici uygulamalardan gelen tüm amaçlar, yalnızca uygulamanızın beyan ettiği bir <intent-filter>
öğesinin işlemleri ve kategorileriyle eşleşmesi durumunda uygulamanızın dışa aktarılan bir bileşenine iletilir. Bu davranış, gönderen uygulamanın hedef SDK sürümünden bağımsız olarak gerçekleşir.
Aşağıdaki durumlarda amaç eşleştirme zorunlu kılınmaz:
- Herhangi bir intent filtresi bildirmeyen bileşenlere yayınlanan intentler.
- Kaynağı aynı uygulama içinde olan amaçlar.
- Sistemden gelen, yani "sistem UID'sinden" (uid=1000) gönderilen amaçlar. Sistem uygulamaları,
system_server
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 intent kullanma
PendingIntent
nesnesi, Intent
nesnesinin etrafındaki sarmalayıcıdır. PendingIntent
öğesinin birincil amacı, yabancı bir uygulamaya, içerdiği Intent
öğesini uygulamanızın kendi işleminden yürütülmüş gibi kullanma izni vermektir.
Beklemedeki amaçların başlıca kullanım alanları şunlardır:
- Kullanıcı, Bildiriminiz ile ilgili bir işlem gerçekleştirdiğinde yürütülecek bir niyetin bildirilmesi (Android sisteminin
NotificationManager
özelliğiIntent
öğesini yürütür). - Kullanıcı, Uygulama Widget'ınızla (Ana ekran uygulaması
Intent
öğesini yürütür) bir işlem gerçekleştirdiğinde yürütülecek bir niyetin tanımlanması. - Gelecekteki bir zamanda yürütülecek bir niyetin bildirilmesi (Android sisteminin
AlarmManager
özelliği,Intent
komutunu yürütür).
Her Intent
nesnesi gibi belirli bir uygulama bileşeni türü (Activity
, Service
veya BroadcastReceiver
) tarafından işlenmek üzere tasarlandığı gibi, PendingIntent
için de aynı dikkat edilecek şekilde oluşturulmalıdır. Beklemedeki bir amaç kullanılırken uygulamanız, amacı startActivity()
gibi bir çağrıyla yürütmez. Bunun yerine, PendingIntent
öğesini oluştururken ilgili oluşturucu yöntemini çağırarak istenen bileşen türünü bildirmeniz gerekir:
Activity
başlatanIntent
içinPendingIntent.getActivity()
.Service
başlatanIntent
içinPendingIntent.getService()
.BroadcastReceiver
başlatanIntent
içinPendingIntent.getBroadcast()
.
Uygulamanız diğer uygulamalardan bekleyen amaçları almadığı sürece, PendingIntent
oluşturmak için yukarıda açıklanan yöntemler muhtemelen ihtiyacınız olan tek yöntem olacaktır.PendingIntent
Her yöntem geçerli uygulamayı Context
, sarmak istediğiniz Intent
öğesini ve amacın nasıl kullanılması gerektiğini (amaçın birden fazla kez kullanılıp kullanılamayacağı gibi) belirten bir veya daha fazla işareti alır.
Beklemedeki amaçları kullanma hakkında daha fazla bilgi edinmek için Bildirimler ve Uygulama Widget'ları API kılavuzları gibi ilgili kullanım alanlarının her birine ait dokümanlara bakın.
Değişkenliği belirtin
Uygulamanız Android 12 veya sonraki bir sürümü hedefliyorsa uygulamanızın oluşturduğu her PendingIntent
nesnesinin değişkenliğini belirtmeniz gerekir. Belirli bir PendingIntent
nesnesinin değiştirilebilir veya sabit olduğunu bildirmek için sırasıyla PendingIntent.FLAG_MUTABLE
veya PendingIntent.FLAG_IMMUTABLE
işaretini kullanın.
Uygulamanız, değişkenlik işaretlerinin ikisini de ayarlamadan bir PendingIntent
nesnesi oluşturmaya çalışırsa sistem bir IllegalArgumentException
gönderir ve Logcat'te aşağıdaki mesaj görünür:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
Mümkün olduğunda değiştirilemez beklemedeki amaçlar oluşturun
Çoğu durumda, uygulamanız aşağıdaki kod snippet'inde gösterildiği gibi sabit PendingIntent
nesneleri oluşturmalıdır. PendingIntent
nesnesi sabitse diğer uygulamalar, amacın çağrılmasının sonucunu ayarlamak için niyeti değiştiremez.
Kotlin
val pendingIntent = PendingIntent.getActivity(applicationContext, REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE);
Ancak belirli kullanım alanları bunun yerine değişebilir PendingIntent
nesneleri gerektirir:
- Bildirimlerde doğrudan yanıt işlemlerini destekleme. Doğrudan yanıt, yanıtla ilişkili PendingIntent nesnesindeki klip verilerinde değişiklik yapılmasını gerektirir. Genellikle bu değişikliği,
fillIn()
yöntemine işaret olarakFILL_IN_CLIP_DATA
ileterek talep edersiniz. CarAppExtender
örnekleri kullanılarak bildirimler Android Auto çerçevesiyle ilişkilendiriliyor.- Görüşmeler,
PendingIntent
örnekleri kullanılarak baloncuklara yerleştiriliyor. Değiş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 bilgisi isteme. DeğişebilirPendingIntent
nesnesi, sistemin konum yaşam döngüsü olaylarını temsil eden intent ekstraları eklemesine olanak tanır. Bu etkinlikler arasında konum değişikliği ve bir sağlayıcının kullanılabilir hale gelmesi yer alır.AlarmManager
kullanarak alarm planlama. DeğişebilirPendingIntent
nesnesi, sisteminEXTRA_ALARM_COUNT
amacını ekstra eklemesine olanak tanır. Bu ekstra değer, tekrarlanan bir alarmın kaç kez tetiklendiğini gösterir. Bu ekstra içeriği içerdiğinden amaç, tekrarlanan bir alarmın birden fazla kez tetiklenip tetiklenmediğini (örneğin, cihazın uyku modundayken) uygulamaya doğru bir şekilde bilgi verebilir.
Uygulamanız değişebilir bir PendingIntent
nesnesi oluşturuyorsa açık amaç kullanmanız ve ComponentName
doldurmanız önerilir. Böylece başka bir uygulama PendingIntent
işlevini çağırıp kontrolü uygulamanıza geri verdiğinde, uygulamanızda her zaman aynı bileşen başlar.
Beklemedeki amaçlar içinde açık intentler kullanın
Diğer uygulamaların, uygulamanızın beklemedeki amaçlarını nasıl kullanabileceğini daha iyi tanımlamak için beklemedeki bir niyeti her zaman açık amacın etrafına sarmalayın. Bu en iyi uygulamadan yararlanmak için aşağıdakileri yapın:
- 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 (API düzeyi 23) sürümüne eklenen
FLAG_IMMUTABLE
'ı kullanın. Bu işaret,PendingIntent
alan uygulamaların doldurulmamış özellikleri doldurmasını engeller. Uygulamanızı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ümü
Sistem bir etkinlik başlatmak için örtülü bir niyet aldığında, üç unsura göre intent filtreleriyle karşılaştırarak amaç için en iyi etkinliği arar:
- İşlem.
- Veri (hem URI hem de veri türü).
- Kategori.
Aşağıdaki bölümlerde, amaçların bir uygulamanın manifest dosyasındaki intent filtresi bildirimine göre uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.
Aksiyon testi
Kabul edilen amaç işlemlerini belirtmek için intent filtreleri aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <action>
öğesi bildirebilir:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
Bu filtreyi geçmek için Intent
ile belirtilen işlem, filtrede listelenen işlemlerden biriyle eşleşmelidir.
Filtre herhangi bir işlemi listelemezse niyetin eşleştireceği bir şey olmaz. Bu nedenle, tüm amaçlar testte başarısız olur. Bununla birlikte, Intent
bir işlem belirtmiyorsa filtre en az bir işlem içerdiği sürece testi geçer.
Kategori testi
Kabul edilen amaç kategorilerini belirtmek için intent filtreleri aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <category>
öğesi bildirebilir:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
Amacın kategori testini geçmek için Intent
içindeki her kategorinin filtredeki bir kategoriyle eşleşmesi gerekir. Bunun tersi gerekmez. Amaç filtresi, Intent
özelliğinde belirtilenden daha fazla kategori bildirebilir ve Intent
yine de başarılı olur. Bu nedenle, kategorisi olmayan bir amaç, filtrede tanımlanan kategorilerden bağımsız olarak bu testi her zaman geçer.
Not: Android, CATEGORY_DEFAULT
kategorisini startActivity()
ve startActivityForResult()
uygulamalarına iletilen tüm örtülü niyetlere otomatik olarak uygular.
Etkinliğinizin örtülü intentler almasını istiyorsanız önceki <intent-filter>
örneğinde gösterildiği gibi intent filtrelerinde "android.intent.category.DEFAULT"
için bir kategori içermelidir.
Veri testi
Kabul edilen amaç verilerini belirtmek için intent filtreleri aşağıdaki örnekte gösterildiği gibi sıfır veya daha fazla <data>
öğesi bildirebilir:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
Her <data>
öğesi, bir URI yapısı ve veri türünü (MIME medya türü) belirtebilir.
URI'nın her bölümü ayrı bir özelliktir: scheme
, host
, port
ve path
:
<scheme>://<host>:<port>/<path>
Aşağıdaki örnekte, bu özelliklere ilişkin olası değerler gösterilmektedir:
content://com.example.project:200/folder/subfolder/etc
Bu URI'de şema content
, ana makine com.example.project
, bağlantı noktası 200
ve yol folder/subfolder/etc
şeklindedir.
<data>
öğesinde bu özelliklerin her biri isteğe bağlıdır ancak doğrusal bağımlılıklar vardır:
- Şema belirtilmezse ana makine yoksayılır.
- Ana makine belirtilmezse bağlantı noktası yoksayılır.
- Hem şema hem de ana makine belirtilmezse yol yoksayılır.
Bir amaçtaki URI, bir filtredeki URI spesifikasyonuyla karşılaştırıldığında, yalnızca filtreye dahil edilen URI bölümleriyle karşılaştırılır. Örnek:
- Filtre yalnızca bir şema belirtiyorsa bu şemaya sahip tüm URI'lar filtreyle eşleşir.
- Bir filtre bir şema ve yetkili belirtiyor ancak yol belirtmiyorsa aynı şema ve yetkiye sahip tüm URI'ler, yollarına bakılmaksızın filtreden geçer.
- Filtre bir şema, yetkili ve yol belirtiyorsa yalnızca aynı şema, yetkili ve yola sahip URI'lar filtreden geçer.
Not: Yol spesifikasyonu, yol adının yalnızca kısmi eşleşmesini zorunlu kılmak için yıldız joker karakteri (*) içerebilir.
Veri testi, amaçtaki hem URI hem de MIME türünü, filtrede belirtilen bir URI ve MIME türüyle karşılaştırır. Kurallar şunlardır:
- URI veya MIME türü içermeyen bir intent, yalnızca filtre herhangi bir URI veya MIME türü belirtmediğinde testi geçer.
- URI içeren ancak MIME türü olmayan (açık veya URI'dan anlaşılamayan) bir intent, yalnızca URI'si filtrenin URI biçimiyle eşleşiyorsa ve filtre de bir MIME türü belirtmiyorsa testi geçer.
- MIME türü içeren ancak URI olmayan bir intent, yalnızca filtrenin aynı MIME türünü listelediği ve bir URI biçimi belirtmiyorsa testi geçer.
- Hem URI hem de MIME türü (açık veya URI'dan anlaşılabilir) içeren bir intent, yalnızca bu tür filtrede listelenen bir türle eşleşirse testin MIME türü bölümünü geçer. URI'sının filtredeki bir URI ile eşleşmesi veya
content:
ya dafile:
URI'sine sahip olması ve filtrenin bir URI belirtmemesi halinde, testin URI bölümünü geçer. Başka bir deyişle, bir bileşenin filtresi yalnızca bir MIME türünü listeliyorsa bileşenincontent:
vefile:
verilerini desteklediği varsayılır.
Not: Intent bir URI veya MIME türü belirtiyorsa <intent-filter>
içinde <data>
öğesi yoksa veri testi başarısız olur.
Bu son kural, (d) kuralı, bileşenlerin bir dosya veya içerik sağlayıcıdan yerel veriler alabilmeleri beklentisini yansıtır.
Bu nedenle, filtreleri yalnızca bir veri türünü listeleyebilir ve content:
ve file:
şemalarını açıkça adlandırmaları gerekmez.
Aşağıdaki örnekte, bir <data>
öğesinin Android'e, bileşenin bir içerik sağlayıcıdan resim verileri alabileceğini ve bunu gösterebileceğini bildirdiği tipik bir durum gösterilmektedir:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
Kullanılabilir verilerin çoğu içerik sağlayıcılar tarafından dağıtıldığından, bir veri türünü belirten ancak URI olmayan filtreler muhtemelen en yaygın olanlardır.
Yaygın olarak kullanılan diğer bir yapılandırma ise şema ve veri türü içeren bir filtredir. Örneğin, aşağıdaki gibi bir <data>
öğesi, Android'e bileşenin işlemi gerçekleştirmek için ağdan video verileri alabileceğini bildirir:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Amaç eşleştirme
Intent'ler, etkinleştirilecek hedef bileşeni ve cihazdaki bileşen grubu hakkında bir şeyler keşfetmek için intent filtreleriyle eşleştirilir. Örneğin Home uygulaması, ACTION_MAIN
işlemini ve CATEGORY_LAUNCHER
kategorisini belirten intent filtreleriyle tüm etkinlikleri bularak uygulama başlatıcıyı doldurur.
Eşleme, yalnızca Amaç'taki eylemler ve kategorilerin IntentFilter
sınıfı belgelerinde açıklandığı gibi filtreyle eşleşmesi durumunda başarılı olur.
Uygulamanız, Home uygulamasının işlevine benzer bir şekilde amaç eşleştirmeyi kullanabilir.
PackageManager
, belirli bir amacı kabul edebilecek tüm bileşenleri döndüren bir dizi query...()
yöntemine ve bir amaca yanıt vermek için en iyi bileşeni belirleyen benzer bir resolve...()
yöntem dizisine sahiptir. Örneğin, queryIntentActivities()
, bağımsız değişken olarak iletilen amacı gerçekleştirebilecek tüm etkinliklerin listesini döndürür, queryIntentServices()
ise benzer bir hizmet listesi döndürür.
İki yöntem de bileşenleri etkinleştirmez. Yalnızca yanıt verebilecekleri listeler. Yayın alıcıları için de queryBroadcastReceivers()
gibi bir yöntem vardır.