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.
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
lubACTION_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 atrybutandroid:mimeType
, aby zadeklarować typ dane, które obsługuje Twoja aktywność, na przykładtext/plain
lubimage/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.