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.
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
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