Niyetler ve niyet filtreleri

Intent, işlem isteğinde bulunmak için kullanabileceğiniz bir mesajlaşma nesnesidir başka bir uygulama bileşeninden kaldırın. 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 bir hizmet başlatabilirsiniz JobScheduler ile birlikte. 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 hizmeti başlatmak için gereken hizmeti açıklar ve gerekli 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, amaçların 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ılırken amacın 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 olduğundan emin olmak için uygunsuz kullan niyetini Service başlatın ve yalnızca hizmetleriniz için intent filtreleri bildirin. Dolaylı intent kullanarak bir hizmeti başlatmak, hangi hizmetin amaca yanıt vereceğinden emin olamadığınız için güvenlik tehlikesi oluşturabilirsiniz. ve kullanıcı hangi hizmetin başlatıldığını göremez. Android 5.0 (API düzeyi 21) sürümünden itibaren, sistem bindService() öğesini çağırırsanız bir istisna oluşturur gizli bir niyeti vardır.

Amaç oluşturma

Intent nesnesi, Android sisteminin kullandığı bilgileri taşır hangi bileşenin başlatılacağını (tam bileşen adı veya bileşen gibi) alıcı bileşeninin kullandığı bilgiler ile birlikte alıcı bileşeninin gereken tüm bilgileri (ör. yapılacak işlem ve üzerinde işlem yapılacak veriler) içeren,

Intent içinde yer alan temel bilgiler şunlardır:

Bileşen adı
Başlatılacak bileşenin adı.

Bu isteğe bağlıdır ancak kullanıcının bir niyetini göstermesini sağlayan explicit: Amacın yalnızca uygulama bileşenine teslim edilmesi gerektiği anlamına gelir bileşen adına göre tanımlanır. 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. Belirli bir uygulamanızda kullanıyorsanız, bileşen adını belirtmeniz gerekir.

Not: Service başlatırken, bileşen adını her zaman belirtin. Aksi takdirde, hangi hizmetin işleme başlar ve kullanıcı hangi hizmetin başladığı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 amacı olarak da bilinir. Kullanıcının yapabileceği bazı verileriniz olduğunda bunu startActivity() ile niyette kullanmalısınız e-posta uygulaması veya sosyal paylaşım uygulaması gibi başka bir uygulama üzerinden paylaşabilirsiniz.

Daha fazla bilgi için Intent sınıf referansını inceleyin genel işlemleri tanımlayan sabit değerlerdir. Diğer işlemler tanımlanmış Android çerçevesinin diğer bölümlerinde (ör. işlemler için Settings) sistemin Ayarlar uygulamasında belirli ekranları açan.

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ü belirtmeniz, Android'in amacınızı karşılayacak en iyi bileşeni bulur. Bununla birlikte, MIME türü bazen URI'dan çıkarılabilir. Özellikle de veriler content: URI'si. content: URI'si, verilerin cihazda bulunduğunu gösterir ve kontrol edilen bir ContentProvider; bu, veri MIME türünü sistem için 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 hem de MIME türünü ayarlamak istiyorsanız setData() adlı kişiyi aramayın ve setType() çünkü her biri diğerinin 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. Sık karşılaşılan 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. Niyet, aşağıdaki bilgileri de sağlayabilir:

Ekstralar
Şu işlemleri gerçekleştirmek için gereken ek bilgileri içeren anahtar/değer çiftleri istenen eylem. Bazı eylemler belirli türde veri URI'ları 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. Uygulama bir Bundle nesnesindeki verilere erişmeye çalışıyor ancak veya serileştirilmiş sınıfa erişimi varsa sistem bir RuntimeException.

İş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 sunulmasından sonra nasıl ele alınacağına ilişkin bilgiler (örneğin, en son etkinlikler).

Daha fazla bilgi için setFlags() yöntemine bakın.

Uygunsuz amaç ö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 işleyebilecek yalnızca bir uygulama varsa, söz konusu uygulama hemen açılır ve kendisine isteyebilirsiniz. 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() öğesine iletin. Bu örnekte, createChooser() yöntemine geçirilen amaca yanıt veren ve sağlanan metni iletişim kutusu başlığına dokunun.

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 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, iç içe yerleştirilmiş bir niyeti, teslim edilen bir niyetin ekstralarından ayrıştırı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 olup olmadığını kontrol etme

Uygulamanızda güvenli olmayan intent başlatmaları olup olmadığını kontrol etmek için şu numarayı arayın: detectUnsafeIntentLaunch() aşağıdaki kod snippet'inde gösterildiği gibi VmPolicy öğenizi yapılandırdığınızda görünür. Eğer bir StrictMode ihlali algıladığında, uygulamanızın hassas olabilecek bilgileri koruma altına alır.

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, uygulama çağrıları putExtras(Intent) veya putExtras(Bundle). Uygulamanız bu işlemlerden birini gerçekleştirirse yalnızca beklentilerin karşılanmasını sağlar. 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. Uygulamanızın amacını aldıktan sonra, diğer uygulama iç içe yerleştirilmiş PendingIntent nesne algılandı.
  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: Açık intent her zaman hedefine iletilir. bileşenlerinin tanımladığı intent filtrelerinden bağımsız olarak.

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>
Kabul edilen amaç kategorisini name özelliğinde belirtir. Değer bir eylemin sınıf sabiti değil, harflerden oluşan dize değeri olmalıdır.

Not: Dolaylı intent'leri almak için içermelidir: Amaç filtresinde CATEGORY_DEFAULT kategorisi. 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 bölümde bulabilirsiniz Niyet Çözümü hakkında.

Dikkat: Amaç filtresi kullanmak, diğer uygulamaların başlamasını engellemenin güvenli bir yolu değildir bileşenlerine ayıralım. Amaç filtreleri bir bileşeni yalnızca 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. Bileşenlerinizden birini yalnızca kendi uygulamanızın başlatabilmesi önemliyse, manifest dosyanızda intent filtreleri bildirmeyin. 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() 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 olduğunu ve bunun ana giriş noktası olduğunu ve intent verisi beklemediğini belirtir.
  • 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 amacınız bir uygulamanın işlemleri ve kategorileriyle eşleşiyorsa <intent-filter> öğesi. Sistem, denk düştüğünde bir ActivityNotFoundException Gönderen uygulama, bu istisnayı yapalım.

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 birincil amacı yabancı bir uygulamaya izin vermek Intent öğesini çalışmasını sağlar.

Beklemedeki amaçların başlıca kullanım alanları şunlardır:

Her bir Intent nesnenin belirli bir bir uygulama bileşeni türü (Activity, Service veya BroadcastReceiver), dolayısıyla PendingIntent üretilir. 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 amaçları kullanma hakkında daha fazla bilgi için her birinin dokümanlarına bakın: Bildirimler gibi ilgili kullanım alanlarına ve Uygulama Widget'ları API kılavuzlarını inceleyin.

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. Bunu beyan etmek için belirli bir PendingIntent nesnesi değişebilir veya sabitse PendingIntent.FLAG_MUTABLE veya PendingIntent.FLAG_IMMUTABLE işaretini tıklayı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 etkinliklerde şunlar yer alır: bir sağlayıcının sunulmasına neden olabilir.
  • 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 şekilde, başka bir uygulama PendingIntent işlevini çağırır ve kontrolü uygulamanıza geri iletir. her zaman aynı bileşenin başlaması gerekir.

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 değeri 22 veya daha düşük olduğu için birlikte güvenlik ve uyumluluk sağlayabilirsiniz. kullanabilirsiniz:

    if (Build.VERSION.SDK_INT >= 23) {
      // Create a PendingIntent using FLAG_IMMUTABLE.
    } else {
      // Existing code that creates a PendingIntent.
    }

Amaç çözümü

Sistem bir etkinlik başlatmak için örtülü bir niyet aldığında amaca yönelik en iyi etkinliği, üç unsura göre intent filtreleriyle karşılaştırırız:

  • İşlem.
  • Veri (hem URI hem de veri türü).
  • Kategori.

Aşağıdaki bölümlerde amaçların uygun bileşenlerle nasıl eşleştirildiği açıklanmaktadır uygulamanın manifest dosyasındaki intent filtresi beyanına göre.

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 gerekmez. Amaç filtresi Intent ve Intent hâlâ geçti. 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 bir veri türü (MIME medya türü) belirtebilir. URI'nın her bölümü ayrı bir öğedir özellik: scheme, host, port, ve path:

<scheme>://<host>:<port>/<path>

Aşağıdaki örnekte, bu ö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 filtre bir şema ve bir yetkili belirtiyor ancak yol belirtmiyorsa tüm URI'lar filtreleri, yollarına bakılmaksızın 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 şunlardır:

  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. Başka bir deyişle, bir bileşenin content: ve file: verilerini desteklediği varsayılırsa kullandığı filtrede yalnızca bir MIME türü listeleniyor.

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 olduğu genel bir durum gösterilmektedir Android'e, bileşenin bir içerikten resim verileri alabileceğini bildirir sağlayın ve görüntüleyin:

<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, örneğin, <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 de bileşenleri etkinleştirmez; yalnızca satın alma işlemini yanıt verebilir. Benzer bir yöntem var. Yayın alıcıları için queryBroadcastReceivers().