Uygulamanız, başka bir uygulama için faydalı olabilecek bir işlem gerçekleştirebiliyorsa etkinliğinizde uygun intent filtresini belirterek uygulamayı işlem isteklerine yanıt vermeye hazır hale getirin.
Ö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 (anlam ayrımı oluşturma iletişim kutusu olarak da bilinir) bir seçenek olarak görünür.
Diğer uygulamaların etkinliğinizi bu şekilde başlatmasını sağlamak amacıyla ilgili <activity>
öğesi için manifest dosyanıza bir <intent-filter>
öğesi eklemeniz gerekir.
Uygulamanız bir cihaza yüklendiğinde, sistem intent filtrelerinizi tanımlar ve bilgileri yüklü tüm uygulamalar tarafından desteklenen dahili bir amaç kataloğuna ekler.
Bir uygulama, dolaylı bir niyetle startActivity()
veya startActivityForResult()
çağırdığında, sistem, amaca yanıt verebilecek etkinlikleri kontrol eder.
Amaç filtresi ekle
Etkinliğinizin hangi niyetleri işleyebileceğini doğru şekilde tanımlamak için eklediğiniz her intent filtresini, etkinliğin kabul ettiği işlem türü ve veriler açısından mümkün olduğunca spesifik hale getirin.
Belirli bir Intent
etkinliği, Intent
nesnesinin aşağıdaki ölçütlerini karşılayan bir intent filtresine sahipse sistem, söz konusu etkinliğe gönderebilir:
- İşlem
- Gerçekleştirilecek işlemi adlandıran bir dize. Genellikle
ACTION_SEND
veyaACTION_VIEW
gibi platform tanımlı değerlerden biridir.Bunu,
<action>
öğesiyle amaç 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. - Veri
- Amaçla ilişkilendirilen verilerin açıklaması.
Bunu,
<data>
öğesiyle amaç filtrenizde belirtin. Bu öğede bir veya daha fazla özelliği kullanarak MIME türünü, URI önekini, URI şemasını veya kabul edilen veri türünü gösteren diğer ikisinin bir kombinasyonunu belirtebilirsiniz.Not: Etkinliğinizin diğer "ekstra" verileri işlemesi gibi
Uri
verileriyle ilgili ayrıntıları belirtmeniz gerekmiyorsa URI yerine yalnızcaandroid:mimeType
özelliğini belirterek etkinliğinizin işlediği verilerin türünü (ör.text/plain
veyaimage/jpeg
) belirtin. - Kategori
- Niyeti işleyen etkinliği tanımlamak için ek bir yöntem sunar. Bu yöntem, genellikle işlemin başlatıldığı kullanıcı hareketiyle veya konumla ilgilidir. Sistem tarafından desteklenen birkaç farklı kategori
vardır ancak bunların çoğu nadiren kullanılır. Ancak tüm dolaylı amaçlar varsayılan olarak
CATEGORY_DEFAULT
ile tanımlanır.Bunu,
<category>
öğesiyle intent filtrenizde belirtin.
Amaç filtrenizde, her birini <intent-filter>
öğesinde iç içe yerleştirilmiş karşılık gelen XML öğeleriyle belirterek 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 intent filtresine sahip bir etkinliği burada görebilirsiniz:
<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.
Her gelen intent yalnızca bir işlem ve bir veri türü belirtir. Ancak her bir <intent-filter>
öğesi için <action>
, <category>
ve <data>
öğelerinin birden fazla örneğini beyan edebilirsiniz.
Herhangi iki işlem ve veri çifti, davranışlarında karşılıklı olarak birbirini dışlıyorsa hangi veri türleriyle eşleştirildiğinde hangi işlemlerin kabul edilebilir olduğunu belirtmek için ayrı intent filtreleri oluşturun.
Örneğin, etkinliğinizin hem ACTION_SEND
hem de ACTION_SENDTO
amaçları için hem metin hem de resimleri işlediğini varsayalım. Bu durumda, iki işlem için iki ayrı amaç filtresi tanımlamanız gerekir. Bunun nedeni, ACTION_SENDTO
niyetinin send
veya sendto
URI şemasını kullanarak alıcının adresini belirtmek için Uri
verilerini kullanmasıdır. Bu, aşağıdaki örnekte gösterilmiştir:
<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ı niyet almak için intent filtresine CATEGORY_DEFAULT
kategorisini eklemeniz gerekir. startActivity()
ve startActivityForResult()
yöntemleri tüm amaçları CATEGORY_DEFAULT
kategorisini beyan etmiş gibi ele alır. Niyet filtrenizde belirtmezseniz etkinliğinize hiçbir örtülü intent çözümlenmez.
Sosyal paylaşım davranışları gerçekleştiren ACTION_SEND
amaçları gönderme ve alma hakkında daha fazla bilgi için Diğer uygulamalardan basit veriler alma konusuna bakın.
Veri paylaşımıyla ilgili yararlı bilgileri Basit veriler paylaşma ve Dosya paylaşma bölümlerinde de bulabilirsiniz.
Etkinliğinizdeki amacı ele alın
Etkinliğinizde hangi işlemi yapacağınıza karar vermek için, etkinliği
başlatmada kullanılan Intent
bölümünü okuyun.
Etkinliğiniz başladığında, etkinliği başlatan Intent
öğesini almak için getIntent()
çağrısı yapın. Bu işlemi etkinlik yaşam döngüsü boyunca istediğiniz zaman yapabilirsiniz, ancak genellikle bunu onCreate()
veya onStart()
gibi erken geri çağırmalarda yaparsınız.
Bu, aşağıdaki örnekte gösterilmiştir:
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 isterseniz sonuç kodunu ve Intent
sonucunu belirtmek için setResult()
işlevini çağırın. İşleminiz tamamlandığında ve kullanıcı orijinal etkinliğe geri döndüğünde, etkinliğinizi kapatmak ve kaldırmak için finish()
öğesini çağırın. Bu, aşağıdaki örnekte gösterilmiştir:
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();
Sonucu içeren bir sonuç kodunu her zaman belirtmelisiniz. Genellikle RESULT_OK
veya RESULT_CANCELED
olur. Ardından, gerekirse Intent
ile ek veriler sağlayabilirsiniz.
Not: Sonuç varsayılan olarak RESULT_CANCELED
şeklinde ayarlanmıştır. Dolayısıyla, kullanıcı işlemi tamamlamadan ve siz sonucu ayarlamadan önce Geri düğmesine dokunursa, orijinal etkinlik "iptal edildi" sonucunu alır.
Yalnızca çeşitli sonuç seçeneklerinden birini gösteren bir tam sayı döndürmeniz gerekiyorsa sonuç kodunu 0'dan büyük herhangi bir değere ayarlayabilirsiniz. Bir tam sayı göndermek için sonuç kodunu kullanırsanız ve Intent
öğesini dahil etmeniz gerekmiyorsa setResult()
yöntemini çağırabilir ve yalnızca sonuç kodunu aktarabilirsiniz:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
Bu durumda, yalnızca birkaç olası sonuç 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 sonuç verir, çünkü sonucu alan etkinlik, sonuç kodunun değerini belirlemek için herkese açık sabite referans verebilir.
Not: Etkinliğinizin startActivity()
veya startActivityForResult()
ile başlatılıp başlatılmadığını kontrol etmenize gerek yoktur. Etkinliğinizi başlatan amaç bir sonuç bekliyorsa setResult()
numaralı telefonu arayın. startActivityForResult()
adlı kaynak etkinlik, sistem tarafından setResult()
kaynağına sağladığınız sonucu gönderir. Aksi takdirde sonuç yoksayılır.