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

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

Jeśli na przykład stworzyć aplikację społecznościową, która udostępni wiadomości lub zdjęcia znajomym użytkownika, obsługują intencję ACTION_SEND. Następnie, gdy użytkownicy zainicjują udostępnianie działania z innej aplikacji, aplikacja pojawi się jako opcja w okno wyboru, tak jak na ilustracji 1.

Rysunek 1. Okno wyboru.

Aby inne aplikacje mogły rozpoczynać Twoją aktywność w ten sposób, musisz dodać <intent-filter> dla odpowiedniego elementu <activity> w pliku manifestu.

Gdy aplikacja jest zainstalowana na urządzeniu, system identyfikuje intencję filtruje i dodaje informacje do wewnętrznego katalogu intencji obsługiwanych przez wszystkie zainstalowane aplikacje. Gdy aplikacja zadzwoni pod numer startActivity() lub startActivityForResult() z intencją niejawną, system szuka działań, które mogą reagować intencji.

Dodawanie filtra intencji

Aby poprawnie określić intencje obsługiwane przez aktywność, utwórz każdy dodany filtr intencji najbardziej szczegółowe informacje o rodzaju działania i danych dotyczących działania, akceptuje.

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

Działanie
Ciąg znaków określający działanie, które ma zostać wykonane. Zwykle jedna z wartości zdefiniowanych na platformie, np. jako 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ą ciągu tekstowego dla działania, a nie stałą interfejsu 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>. Jeden atrybutów lub więcej atrybutów w tym elemencie, możesz określić typ MIME, prefiks identyfikatora URI schemat URI lub kombinację tych i innych elementów, które wskazują typ danych; zaakceptowano.

Uwaga: jeśli nie musisz deklarować szczegółów danych, Uri, np. wtedy, gdy obsługujesz aktywność innego rodzaju „ekstra” danych, zamiast identyfikatora URI, podaj tylko atrybut android:mimeType, aby zadeklarować typ dane, które obsługuje Twoja aktywność, na przykład text/plain lub image/jpeg.

Kategoria
Zapewnia dodatkowy sposób scharakteryzowania aktywności odpowiadającej zamiarowi, zwykle związanej z intencją do gestu użytkownika lub miejsca, z którego został uruchomiony. Istnieje kilka różnych kategorii. obsługiwane przez system, ale większość z nich jest rzadko używana. Wszystkie intencje niejawne są jednak definiowane za pomocą funkcji CATEGORY_DEFAULT.

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

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

Oto na przykład działanie z filtrem intencji, które obsługuje intencję ACTION_SEND, gdy typem danych jest 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 była inna po kliknięciu domyślnej ikony aktywności, dodaj android:icon w <intent-filter> .

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

Jeśli dowolne dwie pary działań i danych wzajemnie się wykluczają należy utworzyć osobne filtry intencji, aby określić, które działania są dopuszczalne. po połączeniu z jakimi typami danych.

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

<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ć intencje pośrednie, musisz podać CATEGORY_DEFAULT w filtrze intencji. Metody startActivity() i startActivityForResult() traktują wszystkie intencje tak, jakby zadeklarowano kategorię CATEGORY_DEFAULT. Jeśli nie zadeklarujesz w filtrze intencji nie prowadzą do niej żadne niejawne intencje.

Więcej informacji o wysyłaniu i odbieraniu opcji ACTION_SEND użytkowników o zamiarach wykonywania działań związanych 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ż proste udostępnianie danych oraz Udostępnianie plików

Obsługuj intencje w swojej aktywności

Aby zdecydować, co zrobić w przypadku Twojej aktywności, przeczytaj Intent użytych do jego uruchomienia.

Wraz z rozpoczęciem aktywności zadzwoń pod numer getIntent(), aby pobrać Intent, który rozpoczął aktywność. Możesz to zrobić w każdej chwili podczas cyklu życia aktywności, ale zwykle dzieje się to podczas wczesnych wywołań zwrotnych, onCreate() lub onStart().

Widać to w tym przykładzie:

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 działania, które wywołało Twoją, użyj wywołania setResult(), aby określić kod wyniku i wynik Intent. Gdy operacja się zakończy i użytkownik wróci do pierwotnej wersji aktywność, wywołaj finish() do aby doprowadzić do ich zakończenia i zniszczenia. Widać to w tym przykładzie:

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

Musisz zawsze określać kod wyniku wraz z wynikiem. Zwykle jest to RESULT_OK lub RESULT_CANCELED. Następnie możesz: w razie potrzeby przekazywać dodatkowe dane za pomocą atrybutu Intent.

Uwaga: wynik jest ustawiony na RESULT_CANCELED domyślnie. Jeśli użytkownik kliknie Wstecz, przed wykonaniem działania. Zanim ustawisz wynik, pierwotna aktywność „Anulowano” wynik.

Jeśli musisz zwrócić liczbę całkowitą, która wskazuje jedną z kilku opcji wyników, możesz ustawić kodu wyniku na dowolną wartość większą niż 0. Jeśli użyjesz kodu wyniku do podania liczby całkowitej, a Ty nie trzeba uwzględniać Intent, Możesz zadzwonić pod numer setResult() i przekazują tylko kod wyniku:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

setResult(RESULT_COLOR_RED);
finish();

W tym przypadku możliwych wyników może być tylko kilka, więc kod jest generowany lokalnie zdefiniowaną liczbę całkowitą (większą od 0). Działa to dobrze, gdy zwracasz wynik do aktywności w swojej aplikacji, ponieważ aktywność, która otrzymuje wynik, może odnosić się do publicznego stałą do określenia wartości kodu wyniku.

Uwaga: nie musisz sprawdzać, czy aktywność została rozpoczęta. z startActivity() lub startActivityForResult(). Po prostu wywołaj setResult(), jeśli intencja, która rozpoczęła Twoją aktywność, można się spodziewać pożądanego wyniku. Jeśli źródłowa aktywność o nazwie startActivityForResult(), system ją realizuje. wynik podany przez Ciebie w narzędziu setResult(); w przeciwnym razie wynik zostanie zignorowany.