Diğer uygulamaların etkinliğinizi başlatmasına izin verme

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.

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

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 veya ACTION_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ızca android:mimeType özelliğini belirterek etkinliğinizin işlediği verilerin türünü (ör. text/plain veya image/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.