Pozwól innym aplikacjom uruchamiać Twoją aktywność

Jeśli Twoja aplikacja może wykonać działanie, które może być przydatne innej aplikacji, przygotuj ją do odpowiadania na żądania działań, określając odpowiedni filtr intencji w swojej aktywności.

Jeśli na przykład tworzysz aplikację społecznościową, która może udostępniać wiadomości lub zdjęcia znajomym użytkownika, obsługuj intencję ACTION_SEND. Gdy użytkownicy rozpoczną działanie „udostępnij” w innej aplikacji, Twoja aplikacja pojawi się jako opcja w oknie wyboru (znanym też jako okno disambiguacji), jak pokazano na ilustracji 1.

Ilustracja 1. Okno wyboru.

Aby umożliwić innym aplikacjom uruchamianie Twojej aktywności w ten sposób, musisz dodać element <intent-filter> w pliku manifestu dla odpowiedniego elementu <activity>.

Gdy Twoja aplikacja jest zainstalowana na urządzeniu, system identyfikuje filtry intencji i dodaje informacje do wewnętrznego katalogu intencji obsługiwanych przez wszystkie zainstalowane aplikacje. Gdy aplikacja wywołuje startActivity() lub startActivityForResult() z intencją ogólną, system sprawdza, które aktywności mogą na nią odpowiedzieć.

Dodawanie filtra intencji

Aby prawidłowo określić, które intencje może obsługiwać Twoja aktywność, dodaj filtr intencji, który będzie jak najbardziej szczegółowy pod względem typu działania i danych akceptowanych przez aktywność.

System może wysłać daną Intent do aktywności, jeśli ma ona filtr intencji, który spełnia te kryteria obiektu Intent:

Działanie
Ciąg znaków określający działanie do wykonania. Zwykle jedna z wartości zdefiniowanych przez platformę, np. ACTION_SEND lub ACTION_VIEW.

Określ to w filtrze intencji za pomocą elementu <action>. Wartość określona w tym elemencie musi być pełną nazwą działania, a nie stałą API, jak pokazano w przykładach na tej stronie.

Dane
Opis danych powiązanych z intencją.

Określ to w filtrze intencji za pomocą elementu <data>. Za pomocą co najmniej 1 atrybutu w tym elemencie możesz określić typ MIME, prefiks URI, schemat URI lub ich kombinację, a także inne elementy wskazujące akceptowany typ danych.

Uwaga: jeśli nie musisz deklarować szczegółów dotyczących Uri danych, np. gdy Twoja aktywność obsługuje inne rodzaje danych „dodatkowych” zamiast URI, określ tylko atrybut android:mimeType, aby zadeklarować typ danych obsługiwanych przez Twoją aktywność, np. text/plain lub image/jpeg.

Kategoria
Dodatkowy sposób na scharakteryzowanie aktywności obsługującej intencję, zwykle związany z gestem użytkownika lub lokalizacją, z której została uruchomiona. System obsługuje kilka różnych kategorii, ale większość z nich jest rzadko używana. Domyślnie wszystkie niejawne intencje są jednak definiowane za pomocą CATEGORY_DEFAULT.

Określ to w filtrze intencji za pomocą <category> elementu.

W filtrze intencji możesz zadeklarować, które kryteria akceptuje Twoja aktywność deklarując każdy z nich za pomocą odpowiednich elementów XML zagnieżdżonych w elemencie <intent-filter>.

Oto na przykład aktywność z filtrem intencji, który obsługuje intencję ACTION_SEND, gdy typ danych to tekst lub obraz:

<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>

Wskazówka: jeśli chcesz, aby ikona w oknie wyboru różniła się od domyślnej ikony aktywności, dodaj android:icon w elemencie <intent-filter>.

Każda przychodząca intencja określa tylko 1 działanie i 1 typ danych, ale w każdym <intent-filter> możesz zadeklarować wiele instancji elementów <action>, <category> i <data>.

Jeśli 2 pary działania i danych wykluczają się wzajemnie, utwórz osobne filtry intencji, aby określić, które działania są akceptowane w połączeniu z którymi typami danych.

Załóżmy na przykład, że Twoja aktywność obsługuje zarówno tekst, jak i obrazy w przypadku intencji ACTION_SEND i ACTION_SENDTO. W takim przypadku musisz zdefiniować 2 osobne filtry intencji dla tych 2 działań, ponieważ intencja ACTION_SENDTO musi używać danych Uri, aby określić adres odbiorcy za pomocą schematu URI send lub sendto. Pokazuje to ten przykład:

<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>

Uwaga: aby otrzymywać niejawne intencje, musisz uwzględnić kategorię CATEGORY_DEFAULT w filtrze intencji. Metody startActivity() i startActivityForResult() traktują wszystkie intencje tak, jakby deklarowały kategorię CATEGORY_DEFAULT. Jeśli nie zadeklarujesz jej w filtrze intencji, żadne niejawne intencje nie będą kierowane do Twojej aktywności.

Więcej informacji o wysyłaniu i odbieraniu ACTION_SEND intencji, które wykonują działania związane z udostępnianiem w mediach społecznościowych, znajdziesz w artykule Odbieranie prostych danych z innych aplikacji. Przydatne informacje o udostępnianiu danych znajdziesz też w artykułach Udostępnianie prostych danych i Udostępnianie plików.

Obsługa intencji w aktywności

Aby zdecydować, jakie działanie należy podjąć w aktywności, odczytaj Intent, która służy do jej uruchomienia.

Gdy aktywność się uruchamia, wywołaj getIntent(), aby pobrać Intent, która ją uruchomiła. Możesz to zrobić w dowolnym momencie cyklu życia aktywności, ale zwykle robisz to podczas wczesnych wywołań zwrotnych, takich jak onCreate() lub onStart().

Pokazuje to ten przykład:

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
    }
}

Zwracanie wyniku

Jeśli chcesz zwrócić wynik do aktywności, która wywołała Twoją aktywność, wywołaj setResult(), aby określić kod wyniku i wynik Intent. Gdy operacja się zakończy i użytkownik wróci do pierwotnej aktywności, wywołaj finish(), aby zamknąć i zniszczyć swoją aktywność. Pokazuje to ten przykład:

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();

Zawsze musisz określić kod wyniku. Zwykle jest to RESULT_OK lub RESULT_CANCELED. W razie potrzeby możesz podać dodatkowe dane za pomocą Intent.

Uwaga: domyślnie wynik jest ustawiony na RESULT_CANCELED. Jeśli więc użytkownik kliknie przycisk Wstecz, zanim wykona działanie i zanim ustawisz wynik, pierwotna aktywność otrzyma wynik „anulowano”.

Jeśli musisz tylko zwrócić liczbę całkowitą wskazującą jedną z kilku opcji wyniku, możesz ustawić kod wyniku na dowolną wartość większą niż 0. Jeśli używasz kodu wyniku do przekazania liczby całkowitej i nie musisz uwzględniać Intent, możesz wywołać setResult() i przekazać tylko kod wyniku:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

setResult(RESULT_COLOR_RED);
finish();

W takim przypadku może być tylko kilka możliwych wyników, więc kod wyniku jest zdefiniowaną lokalnie liczbą całkowitą (większą niż 0). Sprawdza się to dobrze, gdy zwracasz wynik do aktywności w swojej aplikacji, ponieważ aktywność, która otrzymuje wynik, może odwoływać się do stałej publicznej, aby określić wartość kodu wyniku.

Uwaga: nie musisz sprawdzać, czy Twoja aktywność została uruchomiona za pomocą startActivity() czy startActivityForResult(). Jeśli intencja, która uruchomiła Twoją aktywność, może oczekiwać wyniku, po prostu wywołaj setResult(). Jeśli aktywność źródłowa wywołała startActivityForResult(), system dostarczy jej wynik podany w setResult(); w przeciwnym razie wynik zostanie zignorowany.