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 eylem taleplerine yanıt vermesi için uygun intent filtresine sahip olmanız gerekir.

Örneğin, kullanıcının arkadaşlarıyla mesaj veya fotoğraf paylaşabilen bir sosyal uygulama geliştirme, ACTION_SEND amacını destekler. Ardından kullanıcılar bir "paylaşım" işlemi başlattığında başka bir uygulamadaki işlemden sonra, uygulamanız Şekil 1'de gösterildiği gibi seçici iletişim kutusu (anlam ayrım iletişim kutusu olarak da bilinir).

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

Diğer uygulamaların etkinliğinizi bu şekilde başlatmasına izin vermek için bir <intent-filter> eklemeniz gerekir öğesine karşılık gelen <activity> öğesine ilişkin manifest dosyanızda bir öğe oluşturun.

Uygulamanız bir cihaza yüklendiğinde sistem, amacınızı belirler filtreleri ve bilgileri, tüm yüklü uygulamalar tarafından desteklenen dahili bir intent kataloğuna ekler. Bir uygulama startActivity() veya startActivityForResult() aradığında gizli bir niyetiniz varsa sistem, isteyebilirsiniz.

Amaç filtresi ekle

Etkinliğinizin işleyebileceği amaçları doğru şekilde tanımlamak için eklediğiniz her intent filtresini oluşturun etkinliğin ve etkinliğin veri türü açısından mümkün olduğunca kabul eder.

Sistem, belirli bir Intent etkinliğini aşağıdaki durumlarda gönderebilir. Intent nesnesinin aşağıdaki ölçütlerini karşılayan bir intent filtresi:

İşlem
Yapılacak işlemi adlandıran bir dize. Genellikle platform tarafından belirlenen değerlerden biri, ACTION_SEND veya ACTION_VIEW olarak.

Bunu intent filtrenizde <action> öğesiyle belirtin. Bu öğede belirttiğiniz değer, API sabitidir.

Veri
Amaçla ilişkili verilerin açıklaması

Bunu intent filtrenizde <data> öğesiyle belirtin. Birini kullanma veya daha fazla özellik bulunuyorsa MIME türünü, URI önekini, URI şeması veya veri türünü gösteren bunların ve diğerlerinin kombinasyonu kabul edilir.

Not: Veriler hakkında ayrıntılı bilgi vermeniz gerekmiyorsa Uri (ör. etkinliğinizin işleme konduğu durumlar) başka tür bir "ekstra" verisi, URI yerine yalnızca android:mimeType özelliğini belirtmek için Etkinliğinizin işlediği text/plain veya image/jpeg gibi veriler.

Kategori
Amacı işleyen etkinliği tanımlamak için ek bir yöntem sunar. Bu işlem genellikle birbiriyle ilişkilidir. başlatıldığı kullanıcı hareketi veya konuma yönlendirmelidir. Birkaç farklı kategori vardır sistem tarafından desteklense de çoğu nadiren kullanılır. Ancak tüm örtülü niyetler Varsayılan olarak CATEGORY_DEFAULT.

Bunu intent filtrenizde <category> ile belirtin öğesine dokunun.

Amaç filtrenizde etkinliğinizin hangi ölçütleri kabul ettiğini belirtebilirsiniz. <intent-filter> içinde iç içe yerleştirilmiş karşılık gelen XML öğeleriyle her birini tanımlayarak öğesine dokunun.

Örneğin, veri türü metin veya resim olduğunda ACTION_SEND amacını işleyen intent filtresine sahip bir etkinliği aşağıda 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 farklı olmasını istiyorsanız etkinliğinizin varsayılan simgesinden, <intent-filter> bölümüne android:icon ekleyin öğesine dokunun.

Her gelen intent yalnızca bir işlem ve bir veri türü belirtir. Ancak birden fazla her birindeki <action>, <category> ve <data> öğelerinin örnekleri <intent-filter>

Herhangi bir iki eylem ve veri çifti hangi işlemlerin kabul edilebilir olduğunu belirtmek için ayrı intent filtreleri hangi veri türleriyle eşleştirildiğine bakalım.

Ö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 ayrı iki işlem için intent filtreleri, çünkü ACTION_SENDTO niyetinin belirtmek için Uri verilerini kullanması gerekir send veya sendto URI şemasını kullanarak alıcının adresi. Bu, 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ı niyetleri almak için Amaç filtresinde CATEGORY_DEFAULT kategorisi. startActivity() ve startActivityForResult() yöntemleri tüm amaçları olduğu gibi ele alır , CATEGORY_DEFAULT kategorisini açıkladı. Bunu beyan etmezseniz hiçbir örtülü intent, etkinliğiniz için çözümlenemez.

ACTION_SEND gönderme ve alma hakkında daha fazla bilgi sosyal medya paylaşım davranışlarını gerçekleştiren amaçlarınız için Diğer uygulamalardan basit veriler alma bölümüne bakın. Ayrıca, Basit verileri paylaşmak ve Dosya paylaşma.

Etkinliğinizdeki niyeti ele alın

Etkinliğinizde hangi işleme karar vereceğinize karar vermek için Başlatmak için kullanılan Intent.

Etkinliğiniz başladığında, şunu almak için getIntent() numaralı telefonu arayın: Etkinliği başlatan Intent. Bu işlemi, bu işlemi genellikle erken bir aşamada (örneğin, onCreate() veya onStart().

Bu, 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 Intent sonucunu belirtmek için setResult() çağrısı yapın. İşleminiz tamamlandığında ve kullanıcı orijinal sayfaya döndüğünde etkinliği, finish() adlı kişiyi arayın ve etkinliğinizi kapatın ve yok edin. Bu, 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();

Her zaman sonucu içeren bir sonuç kodu belirtmeniz gerekir. Genellikle RESULT_OK veya RESULT_CANCELED olur. Ardından Gerekirse bir Intent ile ek veri sağlayın.

Not: Sonuç, şu şekilde ayarlanır: RESULT_CANCELED varsayılan olarak. Kullanıcı Geri'ye dokunursa, düğmesini tıklayın. Orijinal etkinlik, işlemi tamamlamadan ve siz sonucu ayarlamadan önce "iptal edildi" yardımcı olur.

Birkaç sonuç seçeneğinden birini gösteren bir tam sayı döndürmeniz gerekiyorsa değer 0'dan büyük bir değer olacaktır. Sonuç kodunu bir tam sayı sunmak için kullanırsanız ve Intent eklemeniz gerekmez. setResult() numaralı telefonu arayabilirsiniz ve yalnızca bir sonuç kodu iletin:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

setResult(RESULT_COLOR_RED);
finish();

Bu örnekte, olası birkaç sonuç olabilir. Bu nedenle sonuç kodu, yerel olarak tanımlanmış tam sayı (0'dan büyük). Bu, bir etkinliğe sonuç döndürdüğünüzde işe yarar çünkü sonucu alan etkinlik, kullanıcılara referans verebilir. sabit değer kullanabilirsiniz.

Not: Etkinliğinizin başlatılıp başlatılmadığını kontrol etmenize gerek yoktur. startActivity() veya startActivityForResult() ile. Etkinliğinizi başlatan amaç varsa setResult() numaralı telefonu aramanız yeterlidir sonuçlar ortaya çıkabilir. Kaynak etkinliğin adı startActivityForResult() ise sistem, göndereni teslim eder. setResult() için sağladığınız sonuç; aksi takdirde sonuç yoksayılır.