Jedną z najważniejszych funkcji Androida jest możliwość wysyłania przez aplikacje użytkownika do innej aplikacji
na podstawie „działania”, które chce osiągnąć. Na przykład, jeśli
że Twoja aplikacja zawiera adres firmy, którą chcesz pokazać na mapie,
aktywność w Twojej aplikacji, która pokazuje mapę. Zamiast tego możesz utworzyć prośbę o wyświetlenie adresu
za pomocą funkcji Intent
. System Android następnie uruchamia aplikację, która może wyświetlać
adres na mapie.
Jak wyjaśniliśmy na pierwszej klasie, Tworzenie Twoja pierwsza aplikacja, musisz używać intencji do przechodzenia między aktywnościami we własnej aplikacji. Ty zwykle robi się to z intencją jawną, która definiuje dokładną nazwę klasy klasy który chcesz uruchomić. Jeśli jednak chcesz, aby inna aplikacja wykonywała jakieś działanie, np. takie jak „wyświetl mapę”, trzeba użyć intencji niejawnych.
Z tej lekcji dowiesz się, jak utworzyć pośrednią intencję dla określonego działania i jak z niej korzystać aby rozpocząć działanie, które pozwala wykonać to działanie w innej aplikacji. Zobacz także film umieszczony tutaj i dowiedz się, dlaczego tak ważne jest uwzględnienie w czasie działania intencji niejawnych.
Tworzenie intencji ogólnej
Intencje ogólne nie deklarują nazwy klasy komponentu na początku, ale zamiast tego deklarują do wykonania. Czynność określa czynność, którą chcesz wykonać, na przykład view, edytować, wysłać lub otrzymać coś.
Powiąż działania związane z zamiarami z danymi
Intencje często obejmują też dane powiązane
z wybraną czynnością, np. z adresem, który chcesz wyświetlić, lub wiadomością, którą chcesz wysłać.
W zależności od intencji, jaką chcesz utworzyć, danymi mogą być: Uri
,
jeden z kilku innych typów danych lub intencja może w ogóle nie potrzebować danych.
Jeżeli dane mają postać Uri
, można użyć prostego konstruktora Intent()
, którego można użyć do zdefiniowania działania
i skalowalnych danych.
Oto jak utworzyć intencję nawiązania połączenia telefonicznego z użyciem danych Uri
do określenia numeru telefonu:
Kotlin
val callIntent: Intent = Uri.parse("tel:5551234").let { number -> Intent(Intent.ACTION_DIAL, number) }
Java
Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
Gdy aplikacja wywoła tę intencję, wywołując funkcję startActivity()
, aplikacja Telefon nawiąże połączenie z podanym numerem telefonu.
Oto kilka innych intencji i ich działań oraz danych Uri
pary:
Wyświetlanie mapy
Kotlin
// Map point based on address val mapIntent: Intent = Uri.parse( "geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California" ).let { location -> // Or map point based on latitude/longitude // val location: Uri = Uri.parse("geo:37.422219,-122.08364?z=14") // z param is zoom level Intent(Intent.ACTION_VIEW, location) }
Java
// Map point based on address Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); // Or map point based on latitude/longitude // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
Wyświetlanie strony internetowej
Kotlin
val webIntent: Intent = Uri.parse("https://www.android.com").let { webpage -> Intent(Intent.ACTION_VIEW, webpage) }
Java
Uri webpage = Uri.parse("https://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
Dodaj dodatki do intencji
Inne rodzaje intencji niejawnych wymagają „dodatkowych” udostępniając różne typy danych,
takich jak ciąg znaków. Za pomocą różnych metod putExtra()
możesz dodać jeden lub więcej dodatkowych danych.
Domyślnie system określa odpowiedni typ MIME wymagany przez intencję na podstawie
Dane Uri
są uwzględniane. Jeśli nie umieścisz elementu Uri
w parametrze
do określenia typu intencji zazwyczaj należy użyć setType()
danych powiązanych z intencją. Ustawienie typu MIME pozwala jeszcze dokładniej określić, jakie typy
Działania powinny otrzymywać intencję.
Oto kilka innych intencji, które dodają dodatkowe dane określające żądane działanie:
Wysyłanie e-maila z załącznikiem
Kotlin
Intent(Intent.ACTION_SEND).apply { // The intent does not have a URI, so declare the "text/plain" MIME type type = "text/plain" putExtra(Intent.EXTRA_EMAIL, arrayOf("jan@example.com")) // recipients putExtra(Intent.EXTRA_SUBJECT, "Email subject") putExtra(Intent.EXTRA_TEXT, "Email message text") putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")) // You can also attach multiple items by passing an ArrayList of Uris }
Java
Intent emailIntent = new Intent(Intent.ACTION_SEND); // The intent does not have a URI, so declare the "text/plain" MIME type emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jan@example.com"}); // recipients emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); // You can also attach multiple items by passing an ArrayList of Uris
Tworzenie wydarzenia w kalendarzu
Uwaga: ta intencja dotycząca wydarzenia w kalendarzu jest obsługiwana tylko w interfejsie API. na poziomie 14 lub wyższym.
Kotlin
// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM. Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply { val beginTime: Calendar = Calendar.getInstance().apply { set(2021, 0, 23, 7, 30) } val endTime = Calendar.getInstance().apply { set(2021, 0, 23, 10, 30) } putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.timeInMillis) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.timeInMillis) putExtra(Events.TITLE, "Ninja class") putExtra(Events.EVENT_LOCATION, "Secret dojo") }
Java
// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM. Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); Calendar beginTime = Calendar.getInstance(); beginTime.set(2021, 0, 23, 7, 30); Calendar endTime = Calendar.getInstance(); endTime.set(2021, 0, 23, 10, 30); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); calendarIntent.putExtra(Events.TITLE, "Ninja class"); calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
Uwaga: pamiętaj, by możliwie najdokładniej zdefiniować pole Intent
. Jeśli na przykład chcesz wyświetlić obraz
za pomocą intencji ACTION_VIEW
należy określić typ MIME
image/*
Blokuje to aplikacje, które mogą „wyświetlać”. innych typów danych (takich jak aplikacja z mapami)
które są wywoływane przez intencję.
Rozpocznij aktywność z intencją
Gdy utworzysz Intent
i ustawisz dodatkowe informacje, wywołaj startActivity()
, aby wysłać je do systemu:
Kotlin
startActivity(intent)
Java
startActivity(intent);
Korzystaj z sytuacji, w której żadna aplikacja nie może otrzymać intencji
chociaż wiele intencji jest obsługiwanych przez inną zainstalowaną aplikację
na urządzeniu, np. telefonie, e-mailu lub kalendarzu. Aplikacja powinna przygotować się
w sytuacji, gdy żadna aktywność nie może zrealizować intencji aplikacji. Zawsze, gdy:
wywoływania intencji, przygotowywania się do wychwycenia
ActivityNotFoundException
,
który występuje, gdy nie ma innej aktywności, która mogłaby obsłużyć zamiary aplikacji.
Kotlin
try { startActivity(intent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
try { startActivity(intent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Gdy zauważysz ten wyjątek, zdecyduj, co aplikacja powinna zrobić dalej. Kolejna zależy od konkretnych cech intencji, którą chcesz wywołać. Jeśli na przykład znasz aplikację, która może obsłużyć zamiar, zawierać link umożliwiający pobranie aplikacji. Dowiedz się więcej o tym, link do Twojego produktu w Google Play.
Okno wyboru aplikacji
Jeśli system zidentyfikuje więcej niż jedno działanie, które może obsłużyć intencję, dla funkcji użytkownik może wybrać aplikację, której chce użyć, jak widać na rysunku 1. Jeśli jest tylko jeden które obsługuje intencję, system natychmiast ją uruchomi.
Pełny przykład
Oto kompletny przykład, który pokazuje, jak utworzyć intencję wyświetlenia mapy, sprawdzić, czy istnieje aplikacja do obsługi intencji, a następnie ją uruchom:
Kotlin
// Build the intent. val location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California") val mapIntent = Intent(Intent.ACTION_VIEW, location) // Try to invoke the intent. try { startActivity(mapIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Build the intent. Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); // Try to invoke the intent. try { startActivity(mapIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Pokaż wybór aplikacji
Zwróć uwagę, że jeśli rozpoczniesz aktywność, przekazując Intent
do startActivity()
, a więcej niż jedna aplikacja reaguje na
zgodnie z intencją, użytkownik może wybrać aplikację, której chce domyślnie używać (zaznaczając pole wyboru u dołu strony
w zakresie dialogu; patrz ilustracja 1). Przydaje się to podczas wykonywania czynności,
Klient chce używać tej samej aplikacji za każdym razem, np. podczas otwierania strony internetowej (użytkownicy
najprawdopodobniej korzystają z jednej przeglądarki) lub robią zdjęcia (użytkownicy wolą używać tylko jednego aparatu).
Jeśli jednak czynność, którą ma wykonać wiele aplikacji, może być wykonywana przez wiele aplikacji, wybierze inną aplikację za każdym razem, np. „udostępnij” działanie, w przypadku którego użytkownicy mogą mieć aplikacji, za pomocą których mogą udostępniać elementy – należy jawnie wyświetlić okno wyboru. jak widać na rysunku 2. Okno wyboru Użytkownik musi za każdym razem wybrać aplikację, która ma wykonać działanie (nie może domyślną aplikacją działania).
Aby wyświetlić selektor, utwórz element Intent
przy użyciu elementu createChooser()
i przekaż go usłudze startActivity()
. Na przykład:
Kotlin
val intent = Intent(Intent.ACTION_SEND) // Create intent to show chooser val chooser = Intent.createChooser(intent, /* title */ null) // Try to invoke the intent. try { startActivity(chooser) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
Intent intent = new Intent(Intent.ACTION_SEND); // Create intent to show chooser Intent chooser = Intent.createChooser(intent, /* title */ null); // Try to invoke the intent. try { startActivity(chooser); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Spowoduje to wyświetlenie okna z listą aplikacji, które odpowiadają na przekazaną intencję
do metody
createChooser()
. Parametr title
może mieć postać
jest podawana, jeśli działaniem nie jest
ACTION_SEND
ani
ACTION_SEND_MULTIPLE