Eine der wichtigsten Android-Funktionen ist die Fähigkeit einer App, Nutzer basierend auf einer „Aktion“, die sie ausführen möchte, zu einer anderen App weiterzuleiten. Wenn Ihre App beispielsweise die Adresse eines Unternehmens enthält, das Sie auf einer Karte anzeigen lassen möchten, müssen Sie keine Aktivität mit einer Karte erstellen. Stattdessen können Sie mit einem Intent
eine Anfrage zum Ansehen der Adresse erstellen. Das Android-System startet dann eine App, die die Adresse auf einer Karte anzeigt.
Wie im ersten Kurs Erstellen Ihrer ersten Anwendung erläutert, müssen Sie Intents verwenden, um zwischen Aktivitäten in Ihrer eigenen Anwendung zu wechseln. Im Allgemeinen tun Sie dies mit einem expliziten Intent, der den genauen Klassennamen der Komponente definiert, die Sie starten möchten. Wenn Sie jedoch möchten, dass eine separate App eine Aktion wie „Karte ansehen“ ausführt, müssen Sie einen impliziten Intent verwenden.
In dieser Lektion erfahren Sie, wie Sie einen impliziten Intent für eine bestimmte Aktion erstellen und damit eine Aktivität starten, die die Aktion in einer anderen App ausführt. Im hier eingebetteten Video erfahren Sie, warum es wichtig ist, Laufzeitprüfungen für Ihre impliziten Intents zu berücksichtigen.
Impliziten Intent erstellen
Implizite Intents deklarieren nicht den Klassennamen der zu startenden Komponente, sondern deklarieren stattdessen eine auszuführende Aktion. Die Aktion gibt an, was Sie tun möchten, z. B. view, edit, send oder get.
Intent-Aktionen mit Daten verknüpfen
Intents enthalten oft auch Daten, die mit der Aktion verknüpft sind, z. B. die Adresse, die Sie ansehen möchten, oder die E-Mail, die Sie senden möchten.
Abhängig vom zu erstellenden Intent können die Daten Uri
, einer von mehreren anderen Datentypen sein oder der Intent benötigt möglicherweise gar keine Daten.
Wenn Ihre Daten Uri
sind, gibt es einen einfachen Intent()
-Konstruktor, mit dem Sie die Aktion und die Daten definieren können.
So erstellen Sie beispielsweise einen Intent, um einen Telefonanruf unter Verwendung der Uri
-Daten zu starten, um die Telefonnummer anzugeben:
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);
Wenn deine App diesen Intent durch Aufrufen von startActivity()
aufruft, initiiert die Telefon App einen Anruf an die angegebene Telefonnummer.
Hier sind einige weitere Intents sowie ihre Aktion und Uri
-Datenpaare:
Karte ansehen
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);
Webseite aufrufen
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);
Extras zu einem Intent hinzufügen
Andere Arten von impliziten Intents erfordern „zusätzliche“ Daten, die andere Datentypen bereitstellen, z. B. einen String. Mit den verschiedenen putExtra()
-Methoden können Sie zusätzliche Daten hinzufügen.
Standardmäßig bestimmt das System anhand der enthaltenen Uri
-Daten den für einen Intent erforderlichen MIME-Typ. Wenn Sie keinen Uri
in den Intent aufnehmen, sollten Sie normalerweise setType()
verwenden, um den Datentyp anzugeben, der mit dem Intent verknüpft ist. Durch Festlegen des MIME-Typs wird weiter festgelegt, welche Arten von Aktivitäten den Intent erhalten sollen.
Hier sind einige weitere Intents, die zusätzliche Daten hinzufügen, um die gewünschte Aktion anzugeben:
E-Mails mit Anhang senden
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
Kalendertermine erstellen
Hinweis:Dieser Intent für einen Kalendertermin wird nur ab API-Ebene 14 unterstützt.
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");
Hinweis:Intent
muss so genau wie möglich definiert werden. Wenn Sie beispielsweise ein Image mit dem Intent ACTION_VIEW
anzeigen lassen möchten, sollten Sie den MIME-Typ image/*
angeben. So wird verhindert, dass Apps, die andere Datentypen „ansehen“ können (z. B. Karten-Apps), durch den Intent ausgelöst werden.
Aktivität mit dem Intent starten
Nachdem du die Intent
erstellt und die zusätzlichen Informationen festgelegt hast, rufe startActivity()
auf, um sie an das System zu senden:
Kotlin
startActivity(intent)
Java
startActivity(intent);
Umgang mit einer Situation, in der keine App einen Intent empfangen kann
Obwohl viele Intents erfolgreich von einer anderen auf dem Gerät installierten App verarbeitet werden (z. B. einer Telefon-, E-Mail- oder Kalender-App), sollte sich Ihre App auf die Situation vorbereiten, in der keine Aktivität den Intent Ihrer App verarbeiten kann. Wenn Sie einen Intent aufrufen, muss ein ActivityNotFoundException
abgefangen werden. Dies tritt auf, wenn es keine andere Aktivität gibt, mit der der Intent Ihrer App verarbeitet werden kann:
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. }
Sobald diese Ausnahme erkannt wurde, entscheiden Sie, was Ihre App als Nächstes tun soll. Der nächste Schritt hängt von den spezifischen Merkmalen des Intents ab, den Sie aufrufen wollten. Wenn du beispielsweise eine bestimmte App kennst, die den Intent verarbeiten kann, gib einen Link an, über den der Nutzer die App herunterladen kann. Weitere Informationen zum Verknüpfen deines Produkts bei Google Play
Dialogfeld zur Begriffsklärung
Wenn das System mehr als eine Aktivität identifiziert, die den Intent verarbeiten kann, wird ein Dialogfeld (manchmal auch als „Auswahldialog“ bezeichnet) angezeigt, in dem der Nutzer auswählen kann, welche App verwendet werden soll (siehe Abbildung 1). Wenn es nur eine Aktivität gibt, die den Intent verarbeitet, wird er vom System sofort gestartet.
![Unten auf dem Bildschirm wird ein Steuerfeld angezeigt. In diesem Bereich werden die verschiedenen Apps aufgelistet, die den Intent verarbeiten können.](https://developer.android.com/static/images/training/basics/intents-choice.png?authuser=6&hl=de)
Abbildung 1: Beispiel für das Auswahldialogfeld, das angezeigt wird, wenn mehr als eine App einen Intent verarbeiten kann.
Vollständiges Beispiel
Das folgende Beispiel zeigt, wie Sie einen Intent zum Ansehen einer Karte erstellen, prüfen, ob eine App zur Verarbeitung des Intents vorhanden ist, und ihn dann starten:
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. }
App-Auswahl anzeigen
![](https://developer.android.com/static/images/training/basics/intent-chooser.png?authuser=6&hl=de)
Abbildung 2: Ein Dialogfeld zur Auswahl
Wenn Sie eine Aktivität starten, indem Sie Intent
an startActivity()
übergeben, und mehrere Apps auf den Intent reagieren, kann der Nutzer standardmäßig auswählen, welche App verwendet werden soll. Dazu muss er unten im Dialogfeld ein Kästchen anklicken (siehe Abbildung 1). Das ist praktisch bei einer Aktion, bei der der Nutzer in der Regel jedes Mal dieselbe App verwenden möchte, z. B. beim Öffnen einer Webseite (Nutzer verwenden wahrscheinlich nur einen Webbrowser) oder beim Aufnehmen eines Fotos (Nutzer bevorzugen wahrscheinlich eine Kamera).
Wenn die auszuführende Aktion jedoch von mehreren Apps verarbeitet werden kann und der Nutzer möglicherweise jedes Mal eine andere App bevorzugt, z. B. eine „Teilen“-Aktion, bei der Nutzer mehrere Apps haben, über die sie ein Element teilen können, sollte explizit ein Auswahldialogfeld angezeigt werden (siehe Abbildung 2). Im Auswahldialogfeld muss der Nutzer jedes Mal auswählen, welche App für die Aktion verwendet werden soll. Der Nutzer kann keine Standard-App für die Aktion auswählen.
Erstellen Sie zum Einblenden der Auswahl ein Intent
mit createChooser()
und übergeben Sie es an startActivity()
. Beispiele:
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. }
Daraufhin wird ein Dialogfeld mit einer Liste von Apps angezeigt, die auf den Intent reagieren, der an die Methode
createChooser()
übergeben wurde. Der title
-Parameter kann angegeben werden, wenn die Aktion nicht
ACTION_SEND
oder
ACTION_SEND_MULTIPLE
ist.