Nutzer zu anderer App weiterleiten

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.

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

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.