Nutzer zu anderer App weiterleiten

Eine der wichtigsten Funktionen von Android ist die Fähigkeit einer App, Nutzer zu einer anderen App weiterzuleiten. basierend auf einer „Aktion“ die sie ausführen möchte. Wenn beispielsweise die Adresse eines Unternehmens enthält, das Sie auf einer Karte anzeigen möchten, Aktivität in Ihrer App, die eine Karte anzeigt. Stattdessen können Sie eine Anfrage zum Ansehen der Adresse erstellen. mit Intent. Das Android-System startet dann eine App, die Adresse auf einer Karte anzeigen.

Wie in der ersten Klasse, Erstellen von Your First App: Sie müssen Intents verwenden, um zwischen den Aktivitäten in Ihrer App zu wechseln. Ich in der Regel mit einem expliziten Intent, der den genauen Klassennamen des Komponente, mit der Sie beginnen möchten. Wenn Sie jedoch eine separate App haben möchten, führen Sie eine Aktion wie z. B. „Karte ansehen“, müssen Sie einen impliziten Intent verwenden.

In dieser Lektion erfahren Sie, wie Sie einen impliziten Intent für eine bestimmte Aktion erstellen und verwenden. um eine Aktivität zu starten, die die Aktion in einer anderen App ausführt. Hier kannst du dir auch das hier eingebettete Video ansehen um zu verstehen, warum es wichtig ist, Laufzeitprüfungen für Ihre impliziten Intents einzubeziehen.

Impliziten Intent erstellen

Implizite Intents deklarieren zu Beginn nicht den Klassennamen der Komponente, sondern ein auszuführende Aktion. Die Aktion legt fest, was Sie tun möchten, z. B. Ansehen, edit, send oder get.

Intent-Aktionen mit Daten verknüpfen

Intents enthalten oft auch Daten, durch die Aktion, z. B. die Adresse, die Sie anzeigen möchten, oder die E-Mail-Nachricht, die Sie senden möchten. Je nach Intent, den Sie erstellen möchten, können die Daten ein Uri, einem oder mehreren anderen Datentypen verwendet werden oder der Intent gar keine Daten benötigt.

Für Uri-Daten gibt es einen einfachen Intent()-Konstruktor, mit dem Sie die Aktion definieren Daten.

So erstellen Sie beispielsweise einen Intent, um mithilfe der Uri-Daten einen Anruf zu starten und 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 Ihre App diesen Intent durch Aufrufen von startActivity() aufruft, ruft die Telefon App die angegebene Telefonnummer an.

Hier sind einige andere Intents sowie die zugehörigen Aktions- und Uri-Daten Paare:

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 ansehen

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);

Einem Intent Extras hinzufügen

Für andere Arten von impliziten Intents ist „zusätzliche“ die unterschiedliche Datentypen bereitstellen, wie eine Zeichenfolge. Mit den verschiedenen putExtra()-Methoden können Sie zusätzliche Daten hinzufügen.

Standardmäßig bestimmt das System den für den Intent erforderlichen MIME-Typ anhand des Enthaltene Uri-Daten. Wenn Sie im Feld Uri Intent ausführen, sollten Sie in der Regel mit setType() den Typ mit dem Intent verknüpfte Daten. Durch die weitere Festlegung des MIME-Typs wird angegeben, welche Arten von Aktivitäten sollten den Intent erhalten.

Im Folgenden finden Sie einige weitere Intents, die zusätzliche Daten hinzufügen, um die gewünschte Aktion anzugeben:

E-Mail 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 Kalendertermine wird nur mit der API unterstützt. ab Level 14.

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: Es ist wichtig, dass Sie Ihre Intent so genau wie möglich definieren. Wenn Sie z. B. ein Bild präsentieren möchten, ACTION_VIEW verwenden, sollten Sie als MIME-Typ image/*. Dadurch wird verhindert, dass Apps, die sich „ansehen“ können, andere Datentypen (wie eine Karten-App) nicht durch den Intent ausgelöst wird.

Aktivität mit der gewünschten Absicht starten

Nachdem du deine Intent erstellt und die zusätzlichen Informationen festgelegt hast, ruf startActivity() auf, um sie an das System zu senden:

Kotlin

startActivity(intent)

Java

startActivity(intent);

Umgang mit der Situation, in der keine App einen Intent empfangen kann

Obwohl viele Intents von einer anderen installierten App verarbeitet werden z. B. eine Telefon-, E-Mail- oder Kalender-App, sollte die App wenn keine Aktivität den Intent Ihrer App verarbeiten kann. Wann immer Sie Intent aufrufen, müssen Sie darauf vorbereitet sein, ActivityNotFoundException, Dieser tritt auf, wenn es keine andere Aktivität gibt, die den Intent Ihrer App verarbeiten 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.
}

Nachdem Sie diese Ausnahme erkannt haben, entscheiden Sie, was Ihre App als Nächstes tun soll. Dieses nächste hängt von den spezifischen Merkmalen des Intents ab, den Sie aufrufen. Wenn Sie z. B. eine App kennen, die den Intent verarbeiten kann, einen Link zum Herunterladen der App bereitzustellen. Weitere Informationen zur Link zu Ihrem Produkt bei Google Play.

Begriffsauswahl

Wenn das System mehr als eine Aktivität identifiziert, die den Intent verarbeiten kann, zeigt ein Dialogfeld (manchmal auch als Auswahldialog bezeichnet) für die auszuwählen, welche App verwendet werden soll (siehe Abbildung 1). Wenn es nur eine die den Intent verarbeitet, wird er sofort vom System gestartet.

Ein Steuerfeld wird angezeigt
  unten auf dem Bildschirm. In diesem Bereich sind die Apps aufgelistet,
  mit der Absicht umgehen.

Abbildung 1: Beispiel für die Auswahl Dialogfeld, 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 Sie, ob ein App vorhanden ist, um den Intent zu verarbeiten, und 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 Auswahldialogfeld.

Wenn du eine Aktivität startest, indem du Intent an startActivity() übergibst, gibt es mehr als eine App, die auf Intent auswählen, kann der Nutzer unten auswählen, welche App standardmäßig verwendet werden soll. des Dialogs; siehe Abbildung 1). Dies ist hilfreich, wenn eine Aktion durchgeführt wird, für die die Nutzenden im Allgemeinen jedes Mal dieselbe App verwenden möchte, z. B. beim Öffnen einer Webseite (Nutzer verwenden wahrscheinlich nur einen Webbrowser) oder machen ein Foto (Nutzer bevorzugen wahrscheinlich eine Kamera).

Wenn die auszuführende Aktion jedoch von mehreren Apps ausgeführt werden könnte und der Nutzer eine andere App bevorzugen, z. B. "Teilen" Aktion ausführen, für die Nutzende mehrere Apps, über die er ein Element teilt, sollte explizit ein Auswahldialogfeld angezeigt werden. wie in Abbildung 2 dargestellt. Das Auswahldialogfeld zwingt den Nutzer jedes Mal, die App auszuwählen, die für die Aktion verwendet werden soll. Er kann keine Standard-App für die Aktion).

Um die Auswahl anzuzeigen, erstellen Sie mit createChooser() eine Intent und übergeben Sie sie an startActivity(). Beispiel:

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 übergebenen Intent reagieren. mit der Methode createChooser() verknüpfen. Der title-Parameter kann sein angegeben, wenn die Aktion nicht ACTION_SEND oder ACTION_SEND_MULTIPLE ist