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 birçok yönden kolaylaştırırken
temel kullanım alanları:
- Etkinlik başlatma
Activity
, bir 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.Tamamlandığında etkinlikten bir sonuç almak istiyorsanız
startActivityForResult()
numaralı telefonu arayın. Etkinliğiniz sonucu alır etkinliğinizinonActivityResult()
geri çağırmasında ayrı birIntent
nesnesi olarak. Daha fazla bilgi için Etkinlikler rehberine bakın. - Hizmet başlatma
Service
, arka planda işlemler gerçekleştiren bir bileşendir kullanıcı arayüzü olmadan. 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. Bir hizmeti başlatabilirsiniz tek seferlik bir işlem gerçekleştirmek için (ör. dosya indirme) içinIntent
Hedef:startService()
.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
Anons, tüm uygulamaların alabileceği 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
ileterek diğer uygulamalara anons gönderebilirsiniz Alıcı:sendBroadcast()
veyasendOrderedBroadcast()
.
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 amaç vardır:
- Belirgin amaçlar, tam
ComponentName
belirterek hangi uygulamanın amacı yerine getireceğini 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ı niyetler belirli bir bileşeni adlandırmaz ancak bunun yerine genel bir işlem bildirir Bu, başka bir uygulamadaki bir bileşenin onu işlemesine olanak tanır. Örneğin, kullanıcıya harita üzerinde bir konum gösterirse, başka bir yetenek için istekte bulunmak üzere örtülü bir belirtilen bir konumu haritada gösterir.
Ş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.
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ğini sağlamak için Service
başlatırken her zaman açık bir intent kullanın ve hizmetleriniz için intent filtreleri tanımlamayın. 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 hangi bileşenin başlatılacağını belirlemek için kullandığı bilgileri (ör. intent'i alması gereken bileşenin tam adı veya bileşen kategorisi) ve alıcı bileşenin işlemi düzgün bir şekilde gerçekleştirmek için kullandığı bilgileri (ör. yapılacak işlem ve işleme tabi tutulacak veriler) içerir.
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 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ı olmadığında amaç dolaylı olur ve sistem, diğer amaç bilgilerine dayanarak hangi bileşenin niyeti alacağına karar verir (aşağıda açıklanan eylem, veri ve kategori gibi) sağlar. Uygulamanızda belirli bir bileşeni başlatmanız gerekiyorsa 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
öğesinin bu alanı bir Tamamı kullanarak belirtebileceğinizComponentName
nesnesi uygulamanın paket adı dahil olmak üzere, hedef bileşenin nitelikli sınıf adı (örneğin,com.example.ExampleActivity
. Bileşen adınısetComponent()
,setClass()
,setClassName()
, veyaIntent
oluşturucu. - İş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ı belirler. Özellikle: verilerde bulunan bilgileri dahil etmemeniz gerekir.
Uygulamanızdaki amaçlar tarafından kullanmak (veya başkaları tarafından kullanmak için) kendi işlemlerinizi belirtebilirsiniz uygulamanızdaki bileşenleri çağırmak için kullanılan uygulamalar) ancak genellikle işlem sabitleri
Intent
sınıfı veya diğer çerçeve sınıfları tarafından tanımlanmıştır. Aşağıda bazı örnekler verilmiştir: yaygın olarak kullanılan işlemler:ACTION_VIEW
- Sizi ilgilendiren bazı bilgilere sahip olduğunuzda, bu işlemi
startActivity()
ile niyette kullanın Galeri uygulamasında görüntülenecek bir fotoğraf veya kullanıcıya gösterilecek bir adres gibi bir etkinlik bir harita uygulamasında görüntüleyin. ACTION_SEND
- Paylaşım isteği olarak da bilinen bu isteği, kullanıcının e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabileceği verilere sahip olduğunuzda
startActivity()
ile bir istek içinde kullanmanız gerekir.
Daha fazla bilgi için
Intent
sınıf referansını inceleyin genel işlemleri tanımlayan sabit değerlerdir. 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:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- Veri
- Verilerin başvuruda bulunduğu URI (bir
Uri
nesnesi) ve/veya MIME türü olabilir. Sağlanan verilerin türü genellikle niyetin işlemine göre belirlenir. Örneğin, Örneğin, işlemACTION_EDIT
ise veriler Düzenlenecek dokümanın URI'si.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. Bununla birlikte, MIME türü bazen URI'dan çıkarılabilir. Özellikle de veriler
content:
URI'si.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()
yöntemini çağırın. Gerekirse, hemsetDataAndType()
ile açıkça ayarlayabilirsiniz.Dikkat: Hem URI'yi hem de MIME türünü ayarlamak istiyorsanız
setData()
vesetType()
'yi ç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. İstediğiniz sayıda kategori açıklaması
ancak çoğu amaç kategori gerektirmez.
Yaygın kategorilerden bazıları şunlardır:
CATEGORY_BROWSABLE
- Hedef etkinlik, verileri görüntülemek için bir web tarayıcısı tarafından başlatılmasına izin veriyor Resim veya e-posta mesajı gibi bir bağlantıyla referansta bulunulması.
CATEGORY_LAUNCHER
- Etkinlik, bir görevin ilk etkinliğidir ve uygulamanın başlatıcısını kullanabilirsiniz.
Tam liste için
Intent
sınıf açıklamasına bakın tıklayın.addCategory()
ile kategori belirtebilirsiniz.
Yukarıda listelenen bu özellikler (bileşen adı, işlem, veri ve kategori) bir niyetin karakteristik özelliklerini ifade eder. Bu özellikleri okuyarak, Android sistemi başlatılması gereken uygulama bileşenini çözebilir. Ama bir niyet ek bilgilere uygulama bileşenine nasıl çözümlendiğine bakalım. Intent'ler 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()
ileIntent
içindeBundle
.Örneğin,
ACTION_SEND
, alıcı alıcısınıEXTRA_EMAIL
tuşuna basın ve konuyuEXTRA_SUBJECT
tuşu.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:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Dikkat:
Parcelable
veya Beklediğiniz bir amaç gönderilirkenSerializable
verileri başka bir uygulamaya ihtiyacınız var. 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
sınıfında tanımlanır ve isteyebilirsiniz. İşaretler, Android sistemine bir etkinliğin nasıl başlatılacağını (örneğin, görev ve hedef kitlenize ait kullanıma sunulduğunda 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 intent, belirli bir uygulama bileşenini başlatmak için kullandığınız
belirli bir aktivite ya da hizmet varsa. Açık bir intent oluşturmak için şunları tanımlayın:
Intent
nesnesinin bileşen adı—tümü
diğer intent özellikleri isteğe bağlıdır.
Örneğin, uygulamanızda DownloadService
adlı bir hizmet oluşturduysanız
bir dosyayı ş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, uygulamaya Context
ve
bileşenine Class
nesnesini ekleyin. 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ılavuzu.
Örtülü amaç örneği
Dolaylı intent, cihazdaki herhangi bir uygulamayı çağırabilen bir işlemi belirtir. tıklayın. 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 içeriğiniz varsa,
amaç oluştur
ACTION_SEND
işlemiyle
ve paylaşılacak içeriği belirten fazladan öğeler ekleyin. Aradığınızda
startActivity()
seçeneğini belirlediğinde kullanıcı
İçeriği paylaşacağınız bir uygulama seçmek.
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 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österilene benzer bir iletişim kutusu görüntüler.
Diğer uygulamaları başlatma hakkında daha fazla bilgiyi rehberde de bulabilirsiniz. kullanıcının abonelik veya başka bir uygulama kullanıyorsanız.
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 amaca yanıt veren birden fazla uygulama varsa kullanıcı farklı bir uygulama kullanmak isteyebilir.
her seferinde açık bir şekilde bir seçici iletişim kutusu göstermelisiniz. 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 "paylaşma" işlemi gerçekleştirdiğinde ACTION_SEND
işlemiyle birlikte kullanıcılar, bağlı olarak farklı bir uygulama kullanarak paylaşımda bulunmak isteyebilir.
olduğundan, Şekil 2'de gösterildiği gibi her zaman seçici iletişim kutusunu kullanmanız gerekir.
Seçiciyi göstermek için createChooser()
kullanarak bir Intent
oluşturun ve aşağıdaki örnekte gösterildiği gibi startActivity()
'ye iletin.
Bu örnekte, createChooser()
yöntemine iletilen 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.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) ... // Always use string resources for UI text. // This says something like "Share this photo with" val title: String = resources.getString(R.string.chooser_title) // Create intent to show the chooser dialog val chooser: Intent = Intent.createChooser(sendIntent, title) // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(chooser) }
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
Güvenli olmayan intent başlatmalarını algılama
Uygulamanız, uygulamanızdaki bileşenler arasında gezinmek için veya başka bir uygulama adına bir işlem gerçekleştiremez. Platform güvenliğini iyileştirmek için Android 12 (API düzeyi 31) ve sonraki sürümler sizi uyaran bir hata ayıklama özelliği sunar. Uygulamanız güvenli olmayan bir niyet başlatma işlemi gerçekleştirirse. Ö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 hemen bir uygulama
bileşenini kullanın,
örneğin amacı ekibe
startActivity()
,startService()
, veyabindService()
.
Bu durumu nasıl tanımlayacağınız ve uygulamanızda değişiklik yapacağınız konusunda daha ayrıntılı bilgi için Android Nesting ile ilgili blog yayınını okuyun Intent'ler Medium'da.
Güvenli olmayan intent başlatma işlemlerini kontrol etme
Uygulamanızda güvenli olmayan intent başlatma işlemlerini kontrol etmek için VmPolicy
'ınızı yapılandırırken aşağıdaki kod snippet'inde gösterildiği gibi detectUnsafeIntentLaunch()
işlevini çağırın. Eğer
bir StrictMode ihlali algıladığında, uygulamanızın
hassas olabilecek bilgileri koruma altına alır.
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 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
temizlik ve doğrulama sürecidir. Uygulamanız, ekstraları bir amaçtan
yeni bir bileşeni başlatmak için kullanılan başka bir amaç vardır. Bu durum, uygulamanız putExtras(Intent)
veya putExtras(Bundle)
'i aradığında gerçekleşir.
Uygulamanız bu işlemlerden birini gerçekleştiriyorsa yalnızca alıcı bileşenin beklediği ekstraları kopyalayın. Diğer niyet (kopyayı alan)
çalışmayan bir bileşeni başlatır
dışa aktarma, temizleme ve
ekstraları, başlatma belgesini başlatan amaca kopyalamadan önce
bir bileşenidir.
Uygulamanızın bileşenlerini gereksiz yere dışa aktarmayın. Örneğin,
dahili iç içe yerleştirilmiş intent kullanarak bir uygulama bileşeni başlatmak istiyorsanız
bileşenin android:exported
özelliğini false
olarak güncelleyin.
Bir PendingIntent
yerine
iç içe yerleştirilmiş intent. Bu şekilde, başka bir uygulama kendi PendingIntent
Intent
içeren bir uygulamayı kullanıyorsanız diğer uygulama, PendingIntent
öğesini
kimliğini kullanabilirsiniz. Bu yapılandırma, diğer uygulamanın güvenli bir şekilde başlatılmasına olanak tanır.
Dışa aktarılmayan bileşenler de dahil olmak üzere, uygulamanızdaki herhangi bir bileşeni.
Ş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 uygulamadaki etkinliği çağıran bir amaç oluşturuyor. Şu süre içinde:
bir
PendingIntent
nesnesini ekstra olarak eklersiniz. Bu beklemedeki amaç Uygulamanızdaki bir bileşeni çağırdığında; dışa aktarılmaz. - 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.
seçilebilir. 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şenine diğer uygulamaların erişip erişemeyeceğini 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>
- Çeşitli kullanım alanlarını belirten bir veya daha fazla özelliği kullanarak kabul edilen veri türünü belirtir
veri URI'sinin özellikleri (
scheme
,host
,port
,path
) ve MIME türü. <category>
name
özelliğinde, intent kategorisinin kabul edildiğini belirtir. Değer, sınıf sabit değeri değil, bir işlemin değişmez 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. Amaç filtrenizde bu kategoriyi bildirmezseniz hiçbir örtülü niyet yararlı olabilir.
Ö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.
Yalnızca belirli kombinasyon kombinasyonlarında olmak üzere birden çok amaç türünü işlem, veri ve kategori türüne göre birden fazla intent filtresi oluşturmanız gerekir.
Dolaylı intent, amacın her biriyle karşılaştırılarak bir filtreye karşı test edilir. üç öğeden oluşur. Amacın, bileşene yayınlanması için üç testten de geçmesi gerekir. Bunlardan biriyle bile eşleşmezse Android sistemi, bir bileşenidir. Ancak bir bileşende birden fazla intent filtresi olabileceğinden, geçemeyen bileşenleri başka bir filtreden geçebilir. Sistemin amaçları nasıl çözdüğü hakkında daha fazla bilgiyi aşağıdaki Amaç Çözümü bölümünde bulabilirsiniz.
Dikkat: 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 yanıt verecek şekilde kısıtlasa da
belirli türlerde örtülü niyetler varsa başka bir uygulama, uygulama bileşeninizi başlatabilir
geliştirici, bileşen adlarınızı belirlerse açık bir amaç kullanarak.
Yalnızca kendi uygulamanızın bileşenlerinizden birini başlatabilmesi önemliyse manifest dosyanızda intent filtreleri tanımlamayın. Bunun yerine,
exported
özelliği
"false"
değerine ayarlayın.
Benzer şekilde, yanlışlıkla farklı bir uygulamanın
Service
, kendi hizmetinizi başlatmak için 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, alıcının unregisterReceiver()
kaydını iptal edebilirsiniz. Bu, uygulamanızın
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ı simgesiyle ilk kez başlattığında açılır:
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 gerekir.<activity>
öğesiicon
ile bir simge belirtmediğinde sistem,<application>
simgesinden öğesine dokunun.
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 paylaşımını kolaylaştırmaktır
içerik. 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 uygulamanızın amacını yalnızca amacınız, söz konusu uygulamadaki bir <intent-filter>
öğesinin işlemleri ve kategorileriyle eşleşirse işleyebilir. Sistem eşleşme bulamazsa bir ActivityNotFoundException
hatası oluşturur.
Gönderen uygulama bu istisnayı ele almalıdır.
Benzer şekilde, uygulamanızı Android 13'ü hedefleyecek şekilde güncellerseniz
veya daha yüksek bir değerde, harici uygulamalardan gelen tüm amaçlar
uygulamanızın dışa aktarılan bileşenini, yalnızca bu niyetin işlemlerle ve
uygulamanızın beyan ettiği <intent-filter>
öğesinin kategorileri. Bu davranış
gönderen uygulamanın hedef SDK sürümünden bağımsız olarak gerçekleştirilir.
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 kaynaklanan amaçlar; yani
"sistem UID'si" (uid=1000). Sistem uygulamaları şunları içerir:
system_server
veandroid:sharedUserId
-android.uid.system
. - 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
'ü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 ilgili bir işlem gerçekleştirdiğinde yürütülecek bir niyeti beyan etme
(Android sisteminin
NotificationManager
(Intent
) yürütür. - Kullanıcı
Uygulama Widget'ı
(Ana ekran uygulaması
Intent
öğesini yürütür). - İleriki bir zamanda yürütülecek bir niyetin bildirilmesi (Android
sisteminin
AlarmManager
işlevi,Intent
komutunu 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 amaç kullanılırken uygulamanız
niyeti startActivity()
gibi bir çağrıyla yürütün. Bunun yerine,
PendingIntent
: İlgili içerik üretici yöntemini çağırarak:
- Şunun için
PendingIntent.getActivity()
:Activity
başlatanIntent
. Service
başlayan birIntent
içinPendingIntent.getService()
.- Şunun için
PendingIntent.getBroadcast()
:BroadcastReceiver
başlatanIntent
.
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 (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 değiştirilemez beklemedeki amaçlar 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.
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:
- Şurada doğrudan yanıt işlemlerini destekleme:
bildirimlerine bakın. İlgili içeriği oluşturmak için kullanılan
doğrudan yanıt, PendingIntent nesnesindeki klip verilerinde değişiklik yapılmasını gerektiriyor
bu yanıtla ilişkilidir. Bu değişikliği genellikle
FILL_IN_CLIP_DATA
fillIn()
yöntemidir. - Bildirimleri Android Auto çerçevesiyle ilişkilendirme, örnekleri kullanarak
CarAppExtender
. - Görüşmeleri örnekleri kullanarak baloncuklara yerleştirme
/
PendingIntent
. 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şebilirPendingIntent
nesnesi, sistemin intent ekstralarıdır. Bu etkinlikler arasında konum değişikliği ve bir sağlayıcının kullanıma sunulması yer alır. AlarmManager
kullanarak alarm planlama. DeğişebilirPendingIntent
nesnesi, sisteminEXTRA_ALARM_COUNT
düşünmelisiniz. Bu ekstra değer, tekrarlanan bir alarmın kaç kez tekrarlandığını gösterir tetiklendi. Niyet, bu ekstradan yararlanarak doğru bir şekilde tekrarlayan bir alarmın birden fazla kez tetiklenip tetiklenmediği; örneğin, cihaz uyku moduna geçtiğinde görünür.
Uygulamanız değişebilir bir PendingIntent
nesnesi oluşturuyorsa bunu yapmanız önemle tavsiye edilir
açık niyet kullandığınızı ve
ComponentName
. Bu sayede, başka bir uygulama PendingIntent
'ü çağrdığında ve 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 uygulamadan yararlanmak için aşağıdakileri yapın:
- Temel intent'in action (işlem), package (paket) ve component (bileşen) alanlarının ayarlandı.
-
FLAG_IMMUTABLE
kullanın, beklemedeki intent'ler oluşturmak için Android 6.0'da (API düzeyi 23) eklendi. Bu işaret birPendingIntent
alan uygulamaların doldurulmasını önler doldurulmamış özelliklerdir. UygulamanızınminSdkVersion
sürümü22
veya daha düşükse aşağıdaki kodu kullanarak güvenliği ve uyumluluğu birlikte sağlayabilirsiniz:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
Amaç çözümü
Sistem, bir etkinliği başlatmak için dolaylı bir intent aldığında, intent'i üç unsura göre intent filtreleriyle karşılaştırarak intent için en iyi etkinliği arar:
- İşlem.
- Veri (hem URI hem de veri türü).
- Kategori.
Aşağıdaki bölümlerde, intent'lerin bir uygulamanın manifest dosyasında yer alan intent filtresi beyanına göre uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır.
Aksiyon 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çirilmesi için Intent
içinde belirtilen işlem
filtrede listelenen işlemlerden biriyle eşleşmelidir.
Filtre herhangi bir işlemi listelemiyorsa,
bu nedenle tüm amaçlar 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 gerekli değildir. Amaç filtresi, Intent
'te belirtilenden daha fazla kategori belirtebilir ve Intent
yine de geçer. Bu nedenle, kategori içermeyen bir amaç
filtrede bildirilen kategorilerden bağımsız olarak her zaman bu testten geçer.
Not:
Android, CATEGORY_DEFAULT
kategorisini otomatik olarak uygular
startActivity()
ve startActivityForResult()
'e iletilen tüm örtülü niyetlere.
Etkinliğinizin örtülü niyetler almasını istiyorsanız
intent filtrelerine "android.intent.category.DEFAULT"
için bir kategori ekleyin, çünkü
önceki <intent-filter>
örneğinde gösteriliyor.
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 veri türü (MIME medya türü) belirtebilir.
URI'nin her bölümü ayrı bir özelliktir: scheme
, host
, port
ve path
:
<scheme>://<host>:<port>/<path>
Aşağıdaki örnekte, bu özelliklere ilişkin olası değerler gösterilmektedir:
content://com.example.project:200/folder/subfolder/etc
Bu URI'da şema content
, ana makine com.example.project
,
bağlantı noktası 200
, 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 amaçtaki URI, bir filtredeki URI spesifikasyonuyla karşılaştırıldığında yalnızca filtreye dahil edilen URI'nın bölümleriyle karşılaştırılır. Örnek:
- Bir filtre yalnızca bir şema belirtiyorsa bu şemaya sahip tüm URI'lar eşleşir seçin.
- 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 filtre bir şema, yetkili ve yol belirtiyorsa yalnızca aynı şemaya sahip URI'lar filtreden geçer.
Not: Yol spesifikasyonu yol adının yalnızca kısmi bir eşleşmesini zorunlu kılmak için bir yıldız işareti (*) içermelidir.
Veri testi, amaçtaki hem URI hem de MIME türünü bir URI ile karşılaştırır. ve MIME türünü ifade eder. Kurallar aşağıdaki gibidir:
- URI ya da MIME türü içermeyen bir intent, testi yalnızca filtre herhangi bir URI veya MIME türü belirtmiyorsa test eder.
- 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 olmayan bir intent testi geçer yalnızca filtre aynı MIME türünü listeliyorsa ve bir URI biçimi belirtmiyorsa kullanılabilir.
- 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.
Bu son kural, (d) kuralı, beklentiyi yansıtır.
yerel verileri dosya veya içerik sağlayıcıdan alabildiğiyle ilgili daha fazla bilgi edinin.
Dolayısıyla, filtrelerinde yalnızca bir veri türü listelenebilir ve
content:
ve file:
şemalarını adlandırın.
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,
örnek olarak <data>
öğesi, Android'e
bileşen, işlemi gerçekleştirmek üzere ağdan video verileri alabilir:
<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.
Sadece Amaç'taki işlemler ve kategoriler eşleşirse eşleştirme başarılı olur.
IntentFilter
dokümanlarında açıklandığı gibi bu filtreye dayanarak
sınıfını kullanır.
Uygulamanız, Home uygulamasının işlevine benzer bir şekilde amaç 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öntem
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. Yayın alıcıları için benzer bir yöntem de vardır (queryBroadcastReceivers()
).