Uygulamanız başka bir uygulama için yararlı olabilecek bir işlem gerçekleştirebiliyorsa etkinliğinizde uygun intent filtresini belirterek işlem isteklerine yanıt vermeye hazırlayın.
Örneğin, kullanıcının arkadaşlarıyla mesaj veya fotoğraf paylaşabilen bir sosyal uygulama oluşturuyorsanız ACTION_SEND amacını destekleyin.
Ardından, kullanıcılar başka bir uygulamadan "paylaşma" işlemi başlattığında uygulamanız, Şekil 1'de gösterildiği gibi seçici iletişim kutusunda (netleştirme iletişim kutusu olarak da bilinir) bir seçenek olarak görünür.
Şekil 1. Seçici iletişim kutusu.
Diğer uygulamaların etkinliğinizi bu şekilde başlatmasına izin vermek için manifest dosyanızda ilgili <activity> öğesi için bir <intent-filter> öğesi eklemeniz gerekir.
Uygulamanız bir cihaza yüklendiğinde sistem, amaç filtrelerinizi tanımlar ve bilgileri, yüklü tüm uygulamalar tarafından desteklenen amaçların dahili kataloğuna ekler.
Bir uygulama, dolaylı intentle startActivity() veya startActivityForResult() işlevini çağırdığında sistem, intent'e yanıt verebilecek etkinlikleri kontrol eder.
Niyet filtresi ekleme
Etkinliğinizin hangi intent'leri işleyebileceğini doğru şekilde tanımlamak için eklediğiniz her intent filtresini, etkinliğin kabul ettiği işlem ve veri türü açısından mümkün olduğunca spesifik hale getirin.
Sistem, belirli bir Intent öğesini bir etkinliğe gönderebilir. Bunun için etkinliğin, Intent nesnesinin aşağıdaki ölçütlerini karşılayan bir intent filtresi olması gerekir:
- İşlem
- Gerçekleştirilecek işlemi adlandıran bir dize. Genellikle platform tarafından tanımlanan değerlerden biri (ör.
ACTION_SENDveyaACTION_VIEW) olur.Bunu,
<action>öğesiyle birlikte intent filtrenizde belirtin. Bu öğede belirttiğiniz değer, bu sayfadaki örneklerde gösterildiği gibi API sabiti yerine işlemin tam dize adı olmalıdır. - Veriler
- Amaçla ilişkili verilerin açıklaması.
Bunu,
<data>öğesiyle birlikte intent filtrenizde belirtin. Bu öğede bir veya daha fazla özellik kullanarak MIME türünü, URI önekini, URI şemasını ya da kabul edilen veri türünü belirten bunların ve diğerlerinin bir kombinasyonunu belirtebilirsiniz.Not: Etkinliğinizin URI yerine başka türde "ekstra" verileri ne zaman işlediği gibi verilerle ilgili ayrıntıları beyan etmeniz gerekmiyorsa
Uri, etkinliğinizin işlediği veri türünü (ör.text/plainveyaimage/jpeg) beyan etmek için yalnızcaandroid:mimeTypeözelliğini belirtin. - Kategori
- Amacın işlenmesiyle ilgili etkinliği karakterize etmenin ek bir yolunu sağlar. Bu genellikle kullanıcı hareketiyle veya etkinliğin başlatıldığı konumla ilgilidir. Sistem tarafından desteklenen çeşitli kategoriler vardır ancak çoğu nadiren kullanılır. Ancak tüm örtülü amaçlar varsayılan olarak
CATEGORY_DEFAULTile tanımlanır.Bunu,
<category>öğesiyle birlikte intent filtrenizde belirtin.
Intent filtrenizde, her birini <intent-filter> öğesinde iç içe yerleştirilmiş karşılık gelen XML öğeleriyle bildirerek etkinliğinizin hangi ölçütleri kabul ettiğini belirtebilirsiniz.
Örneğin, veri türü metin veya resim olduğunda ACTION_SEND amacını işleyen bir intent filtresi içeren etkinliğe dair bir örnek aşağıda verilmiştir:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
İpucu: Seçici iletişim kutusundaki simgenin etkinliğinizin varsayılan simgesinden farklı olmasını istiyorsanız <intent-filter> öğesine android:icon ekleyin.
Gelen her niyet yalnızca bir işlem ve bir veri türü belirtir ancak her <intent-filter> içinde <action>, <category> ve <data> öğelerinin birden fazla örneğini bildirebilirsiniz.
İşlem ve verilerin herhangi iki çifti davranışlarında birbirini dışlıyorsa hangi işlemlerin hangi veri türleriyle eşleştirildiğinde kabul edilebilir olduğunu belirtmek için ayrı amaç filtreleri oluşturun.
Örneğin, etkinliğiniz hem ACTION_SEND hem de ACTION_SENDTO amaçları için hem metinleri hem de resimleri işliyor. Bu durumda, iki işlem için iki ayrı intent filtresi tanımlamanız gerekir. Çünkü bir ACTION_SENDTO intent'i, send veya sendto URI şemasını kullanarak alıcının adresini belirtmek için Uri verilerini kullanmalıdır. Bu durum aşağıdaki örnekte gösterilmektedir:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Not: Dolaylı intent'leri almak için intent filtresine CATEGORY_DEFAULT kategorisini eklemeniz gerekir. startActivity() ve startActivityForResult() yöntemleri, tüm amaçları CATEGORY_DEFAULT kategorisini belirtmiş gibi değerlendirir. Intent filtrenizde bunu tanımlamazsanız hiçbir dolaylı intent etkinliğinize çözümlenmez.
Sosyal paylaşım davranışları gerçekleştiren ACTION_SEND
amaçlarını gönderme ve alma hakkında daha fazla bilgi için Diğer uygulamalardan basit veriler alma başlıklı makaleyi inceleyin.
Veri paylaşımı hakkında faydalı bilgileri Basit verileri paylaşma ve Dosya paylaşma başlıklı makalelerde de bulabilirsiniz.
Etkinliğinizde amacı işleme
Etkinliğinizde hangi işlemi yapacağınıza karar vermek için etkinliği başlatmak üzere kullanılan Intent okuyun.
Etkinliğiniz başladığında, etkinliği başlatan Intent almak için getIntent() numaralı telefonu arayın. Bunu etkinliğin yaşam döngüsü boyunca istediğiniz zaman yapabilirsiniz ancak genellikle onCreate() veya onStart() gibi erken geri çağırmalar sırasında yapmanız gerekir.
Bu durum aşağıdaki örnekte gösterilmektedir:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
Sonuç döndürme
Sizinkini çağıran etkinliğe bir sonuç döndürmek istiyorsanız sonuç kodunu ve sonucu belirtmek için setResult() işlevini çağırın Intent. İşleminiz tamamlandığında ve kullanıcı orijinal etkinliğe döndüğünde etkinliğinizi kapatmak ve yok etmek için finish() işlevini çağırın. Bu durum aşağıdaki örnekte gösterilmektedir:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
Sonuçla birlikte her zaman bir sonuç kodu belirtmeniz gerekir. Genellikle RESULT_OK veya RESULT_CANCELED olur. Ardından, gerektiğinde Intent ile ek veriler sağlayabilirsiniz.
Not: Sonuç, varsayılan olarak
RESULT_CANCELED
olarak ayarlanır. Bu nedenle, kullanıcı işlemi tamamlamadan ve sonucu ayarlamadan önce Geri düğmesine dokunursa orijinal etkinlik "iptal edildi" sonucunu alır.
Yalnızca birkaç sonuç seçeneğinden birini belirten bir tam sayı döndürmeniz gerekiyorsa sonuç kodunu 0'dan yüksek herhangi bir değere ayarlayabilirsiniz. Sonuç kodunu bir tam sayı iletmek için kullanıyorsanız ve Intent karakterini eklemeniz gerekmiyorsa setResult() işlevini çağırabilir ve yalnızca bir sonuç kodu iletebilirsiniz:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
Bu durumda, olası sonuçlar yalnızca birkaç tane olabilir. Bu nedenle sonuç kodu, yerel olarak tanımlanmış bir tam sayıdır (0'dan büyük). Bu, kendi uygulamanızdaki bir etkinliğe sonuç döndürdüğünüzde iyi çalışır. Çünkü sonucu alan etkinlik, sonuç kodunun değerini belirlemek için herkese açık sabite başvurabilir.
Not: Etkinliğinizin startActivity() veya startActivityForResult() ile başlatılıp başlatılmadığını kontrol etmenize gerek yoktur. Etkinliğinizi başlatan amaç sonuç bekliyor olabilirse setResult() numaralı telefonu aramanız yeterlidir. Başlatan etkinlik startActivityForResult() ise sistem, setResult() öğesine sağladığınız sonucu iletir; aksi takdirde sonuç yoksayılır.