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 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ümlerde bir hizmet başlatabilirsinizJobScheduler
ile birlikte. 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
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()
öğ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, 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.
![](https://developer.android.google.cn/static/images/components/intent-filters_2x.png?authuser=8&hl=tr)
Ş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ğ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 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çinSettings
) sistemin Ayarlar uygulamasında belirli ekranları açan.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ü 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 birContentProvider
; 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çinsetType()
yöntemini çağırın. Gerekirse, hemsetDataAndType()
ile açıkça ayarlayabilirsiniz.Dikkat: Hem URI hem de MIME türünü ayarlamak istiyorsanız
setData()
adlı kişiyi aramayın vesetType()
çünkü her biri diğerinin 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.
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 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. Uygulama birBundle
nesnesindeki verilere erişmeye çalışıyor ancak veya serileştirilmiş sınıfa erişimi varsa sistem birRuntimeException
. - İş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 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 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.
![](https://developer.android.google.cn/static/images/training/basics/intent-chooser.png?authuser=8&hl=tr)
Ş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:
- Uygulamanız, iç içe yerleştirilmiş bir niyeti, teslim edilen bir niyetin ekstralarından ayrıştırı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 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:
- 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. - Uygulamanızın amacını aldıktan sonra, diğer uygulama iç içe yerleştirilmiş
PendingIntent
nesne algılandı. - 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: 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ö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 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>
öğ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
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
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
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:
- 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 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:
- Şunun için
PendingIntent.getActivity()
:Activity
başlatanIntent
. - Şunun için
PendingIntent.getService()
:Service
başlatanIntent
. - Ş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 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ş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 etkinliklerde şunlar yer alır: bir sağlayıcının sunulmasına neden olabilir. 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 ş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:
- 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
değeri22
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:
- 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. Başka bir deyişle, bir bileşenincontent:
vefile:
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()
.