Niyetler ve niyet filtreleri

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 sitesi Intent ileterek bir Activity ö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ğinizin onActivityResult() geri çağırmasında ayrı bir Intent 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ümlerde JobScheduler ile bir hizmet başlatabilirsiniz. Okuyucu Gelirleri Yöneticisi'ni JobScheduler hakkında bilgi için API-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çin Intent 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() öğesine Intent 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() veya sendOrderedBroadcast().

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.

Şekil 1. Dolaylı intent, başka bir etkinlik başlatmak üzere sistem üzerinden teslim edildi: [1] A Etkinliği Intent adlı kişiyi bir işlem açıklamasıyla birlikte ekler ve startActivity() adlı kullanıcıya iletir. [2] Android Sistemi tümünü arar amaçlarıyla eşleşen intent filtresi için uygulamaları gösterir. Bir eşleşme bulunduğunda sistem [3] onCreate() yöntemini çağırıp Intent ileterek eşleşme etkinliğini (B Etkinliği) başlatır.

Dolaylı intent kullandığınızda Android sistemi başlamak için uygun bileşeni bulur amacın içeriğini olanak tanır. Amaç bir intent filtresiyle eşleşirse sistem bu bileşeni başlatır ve yayınlar. Intent nesnesini tanımlayın. Birden fazla intent filtresi uyumluysa sistem, kullanıcının hangi uygulamayı kullanacağını seçebileceği bir iletişim kutusu gösterir.

Intent filtresi, bir uygulamanın manifest dosyasındaki bir ifadedir. bileşenin çalıştırıldığı amaçların türünü otomatik olarak oluşturulur. Örneğin, bir etkinlik için intent filtresi tanımlayarak diğer uygulamaların etkinliğinizi doğrudan belirli bir amaçla başlatmasını sağlarsınız. Benzer şekilde, bir etkinlik için herhangi bir intent filtresi bildirmezseniz etkinlik başlatılabilir. belirli bir amaç için kullanılabilir.

Dikkat: Uygulamanızın güvenliğ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ğiniz ComponentName 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(), veya Intent 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çin Settings) tanımlanır.

Bir amaca yönelik işlemi setAction() veya bir Intent 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şlem ACTION_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 bir ContentProvider 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çin setType() yöntemini çağırın. Gerekirse, hem setDataAndType() ile açıkça ayarlayabilirsiniz.

Dikkat: Hem URI'yi hem de MIME türünü ayarlamak istiyorsanız setData() ve setType()'yi çağırmayın. Bu iki işlev birbirinin değerini geçersiz kılar. İkisini de ayarlamak için her zaman setDataAndType() 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 bir Bundle nesnesi oluşturabilir ve ardından putExtras() ile Intent içinde Bundle.

Örneğin, ACTION_SEND, alıcı alıcısını EXTRA_EMAIL tuşuna basın ve konuyu EXTRA_SUBJECT tuşu.

Intent sınıfı birçok EXTRA_* 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önderilirken Serializable 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 bir RuntimeException 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 the Context
// 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 the Context
// 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.

Şekil 2. Seçici iletişim kutusu.

Uygulama seçiciyi zorunlu kılma

Dolaylı niyetinize yanıt veren birden fazla uygulama olduğunda Kullanıcı hangi uygulamanın kullanılacağını seçebilir ve söz konusu uygulamayı varsayılan seçenek olarak ayarlayabilir. eyleme dökülebilir. Varsayılan bir ayar seçebilme olanağı, kullanıcının bir işlem gerçekleştirmesi sırasında faydalıdır. büyük olasılıkla her zaman aynı uygulamayı kullanmak ister örneğin, bir web sayfasını açarken (kullanıcılar genellikle tek bir web tarayıcısı tercih edilir).

Ancak 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:

  1. Uygulamanız, gönderilen bir intent'in ekstralarından iç içe yerleştirilmiş bir intent'i paketten çıkarıyor.
  2. Uygulamanız hemen bir uygulama bileşenini kullanın, örneğin amacı ekibe startActivity(), startService(), veya bindService().

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:

  1. 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.
  2. Diğer uygulama, uygulamanızın intent'ini aldıktan sonra iç içe yerleştirilmiş PendingIntent nesnesini ayıklıyor.
  3. Diğer uygulama PendingIntent nesnesinde send() yöntemini çağırır.
  4. 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öntemler startActivity() ve startActivityForResult() tüm amaçları ele alır sanki CATEGORY_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> öğesi icon 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 ve android: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:

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:

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şebilir PendingIntent nesnesi, sistemin doğru işaretler, FLAG_ACTIVITY_MULTIPLE_TASK ve FLAG_ACTIVITY_NEW_DOCUMENT.
  • Sesli arama yaparak cihaz konum bilgisi isteme requestLocationUpdates() veya benzer API'ler. Değişebilir PendingIntent 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şebilir PendingIntent nesnesi, sistemin EXTRA_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:

  1. Temel intent'in action (işlem), package (paket) ve component (bileşen) alanlarının ayarlandı.
  2. FLAG_IMMUTABLE kullanın, beklemedeki intent'ler oluşturmak için Android 6.0'da (API düzeyi 23) eklendi. Bu işaret bir PendingIntent alan uygulamaların doldurulmasını önler doldurulmamış özelliklerdir. Uygulamanızın minSdkVersion 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:

  1. URI ya da MIME türü içermeyen bir intent, testi yalnızca filtre herhangi bir URI veya MIME türü belirtmiyorsa test eder.
  2. 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.
  3. 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.
  4. 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 veya file: URI'sına ekler ve filtre bir URI belirtmez. Diğer bir deyişle, filtresinde yalnızca bir MIME türü listelenen bir bileşenin content: ve file: 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()).