odsyłanie użytkownika do innej aplikacji;

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.

Pojawi się panel
  u dołu ekranu. Zawiera on listę różnych aplikacji, które mogą
  do obsługi intencji.

Rysunek 1. Przykład wybranych opcji pojawia się, gdy więcej niż jedna aplikacja może obsłużyć intencję.

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

Rysunek 2. Okno wyboru.

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