Dies ist eine Lektion unseres alten Android App programmieren Tutorials. Sie wird von uns nicht mehr aktuell gehalten und wurde durch unser neues Android Apps Programmieren Tutorial abgelöst, das immer aktuell gehalten wird.
Mit folgenden Link gelangt ihr zur aktuellen Version dieser Lektion: Implizite Intents in Android.
Hier geht es zu unserem Android Tutorial mit den aktuellen Inhalten.
Da dieser Beitrag für einige Leser trotz fehlender Aktualität dennoch sehr hilfreich ist, haben wir ihn nicht gelöscht. Wenn ihr aber unser aktuelles Android Tutorial machen wollt, dann könnt ihr über den oberen Link direkt zu den neuen Inhalten gelangen.
In diesem Tutorial lernt ihr:
- Was sind implizite Intents?
- Bekannte implizite Intents in Android
- Neuen Menüeintrag in das Options Menu der Action Bar einfügen
- Mittels impliziten Intent eine andere App in Android starten
- Installieren und Starten der App
Ihr solltet auch lesen:
- Android App installieren und ausführen
- Options Menu und Action Bar in Android
- Activities und Intents in Android
Im zwölften Teil unseres großen Android™ Tutorials werden wir aus unserer Aktien-App heraus eine andere App mittels impliziten Intent aufrufen.
Und zwar möchten wir die Web-Funktionalität einer anderen App für unsere Zwecke nutzen. Die bekanntesten Web-Apps, die Webseiten darstellen können, sind Chrome, Firefox und Opera.
Welche Web-App (Browser) tatsächlich aufgerufen wird, entscheidet das Android System dynamisch. Dabei wird nach einer, auf dem Android Gerät, installierten App gesucht, welche die Web-Funktionalität besitzt.
Sind mehrere web-Apps installiert, wird der Benutzer gefragt mit welcher App die Webseite angezeigt werden soll.
Die Web-App werden wir über einen neuen Menüeintrag in der Action Bar unsere AktiendetailActivity aufrufen lassen. Um den neuen Menüeintrag statisch einzufügen, müssen wir die entsprechende XML-Layout Datei erweitern und die zugehörige String-Konstante in der strings.xml
Datei definieren.
Ob der Menüeintrag angeklickt wurde, überprüfen wir mit der onOptionsItemSelected-Methode und führen von dort den Aufruf der anderen App mittels impliziten Intent aus. Den Rest übernimmt dann Android für uns. Ihr werdet sehen, dass unsere Aktien-App mit erstaunlich wenigen Zeilen Code um eine sehr hilfreiche Funktion erweitert werden kann.
Nun wünschen wir euch viel Spaß bei dem zwölften Teil unseres großen Android Tutorials. Los geht’s!
1. Was sind implizite (implicit) Intents in Android?
Intents haben wir bereits in Lektion 10: Activities und Intents des Android Tutorials kennengelernt. Dort haben wir mit Hilfe eines expliziten Intent eine bestimmte Activity unserer App gestartet.
Diesmal möchten wir jedoch eine Activity einer anderen, auf dem Android Gerät installierten, App starten.
Wir verwenden dazu einen impliziten Intent, da wir weder die ausführende Activity noch die andere App zum Zeitpunkt des Aufrufs kennen.
Ein impliziter Intent ist eine Art Benachrichtigungs-Objekt, welches das Android System über ein bestimmtes Vorhaben (die Absicht etwas bestimmtes tun zu wollen) informiert. Man fragt mit einem impliziten Intent eine bestimmte Aktion an, die von einer anderen App-Komponente durchgeführt werden soll.
In unserem Fall möchten wir als Aktion weitere Informationen zu einem bestimmten Finanzsymbol anzeigen lassen.
Die Aktion soll von einer Web-App, wie Google Chrome, ausgeführt werden. Da wir nicht wissen welche Web-Apps auf dem Android Gerät installiert sind, stellen wir beim Android System nur die Anfrage (Request) diese bestimmte Aktion ausführen zu wollen.
Das Android System prüft dann, ob eine Web-App installiert ist und übergibt dieser die notwendigen Informationen, die benötigt werden um unsere angefragte Aktion auszuführen.
Explizite Intents vs. Implizite Intents in Android
In Android gibt es zwei Arten von Intents.
Expliziten Intents legen die zu startende Komponente durch exakte Angabe des Klassennamens fest. Sie werden typischerweise verwendet, um eine Komponente der eigenen App zu starten. Da man die Klassennamen der eigenen App-Komponenten (Activities oder Services) kennt, ist das Verwenden expliziter Intents hierfür die richtige Wahl.
Implizite Intents legen keine bestimmte App-Komponente fest, die gestartet werden soll. Sie geben stattdessen eine allgemeine Aktion an, die von einer Komponente einer anderen App ausgeführt werden soll. Möchte man bspw. dem Benutzer der eigenen App einen Standort auf einer Karte anzeigen, kann man mit einem impliziten Intent bei anderen Apps, die diese Funktionalität besitzen, anfragen diese Aktion auszuführen und zu übernehmen.
Wenn man mit einem expliziten Intent eine Activity oder einen Service startet, wird das Android System die, vom Intent-Objekt mittels Klassennamen, genannte App-Komponente sofort starten.
Bei einem impliziten Intent ist dies anders. Da die zu startende App-Komponente nicht explizit genannt ist, muss sie erst vom Android System gefunden werden. Das Android System findet die passende App-Komponente, indem es den Inhalt des impliziten Intents mit den Intent Filtern der anderen installierten Apps vergleicht. Die Intent Filter sind in der Manifest-Datei jeder App definiert.
Wenn ein impliziter Intent zu einem Intent Filter passt, startet das Android System die entsprechende App-Komponente und übergibt ihr das Intent-Objekt. Falls mehrere Intent Filters zum impliziten Intent passen, zeigt das Android System einen Auswahldialog an und der Benutzer kann die auszuführende App auswählen.
In der unteren Abbildung ist dieser Prozess dargestellt:
Der implizite Intent wird von dem Android System empfangen und weiterverarbeitet und zwar folgendermaßen:
- Die Activity A erzeugt einen impliziten Intent mit einer Beschreibung der auszuführenden Aktion und gibt den Intent an startActivity() weiter.
- Das Android System durchsucht alle auf dem Gerät installierten Apps nach Intent Filtern.
- Wenn eine passende App gefunden wurde, startet das Android System die Activity B durch Aufrufen der onCreate() Methode und übergibt ihr den impliziten Intent.
Was ist ein Intent Filter in Android?
Ein Intent Filter ist ein Ausdruck in der Manifest-Datei einer Android App. Mit den Intent Filtern wird angegeben, welche Intents die entsprechende App-Komponente empfangen möchte.
Möchte man anderen Apps ermöglichen bestimmte Activities der eigenen App direkt zu starten, muss man in den Intent Filtern der Activities die ausführbaren Aktionen deklarieren. Ist kein Intent Filter für eine Activity definiert, kann die Activity nur mit einem expliziten Intent durch exakte Angabe des Klassennamens gestartet werden.
Ein Beispiel für einen Intent Filter ist im unteren Quellcode angegeben:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Mit dem oberen Quellcode wurde eine Activity mit einem Intent Filter deklariert. Der Intent Filter gibt an, dass die Activity ACTION_SEND-Intents empfangen kann, die als data type normalen Text enthalten.
Aufbau eines impliziten Intents in Android?
Ein Intent-Objekt enthält Informationen, die das Android System benutzt, um die App-Komponente zu bestimmen, die gestartet werden soll. Neben diesen Informationen enthält das Intent-Objekt zusätzliche Informationen, die von der empfangenen App-Komponente genutzt werden, um die gewünschte Aktion ausführen zu können.
Jedes Intent-Objekt enthält einige der folgenden Informationen:
- Component Name – Der Name der zu startenden Komponente. Diese Information ist optional und entscheidet darüber, ob der Intent explizit ist. Ohne den Component Name ist der Intent implizit und das Android System entscheidet welche App-Komponente den Intent erhalten soll anhand der weiteren Intent-Informationen, so wie Action, Data oder Category.
- Action – Ein String, der festlegt welche Aktion ausgeführt werden soll. Die Action bestimmt wie die weiteren Informationen des Intents strukturiert sind, d.h. welche Data– und Extras-Informationen anzugeben sind. Bekannte Actions sind ACTION_VIEW (Anzeigen eines Photos in einer Gallerie-App oder einer Adresse in einer Karten-App) und ACTION_SEND (Teilen von Daten mit Hilfe einer anderen App, z.B. eine Email-App oder Social-Sharing-App).
- Data – Enthält die Information über den MIME type und/oder über die URI (Uniform Resource Identifier), die auf die hinterlegten Daten verweist. Der data type wird meist von der Action des Intents vorgegeben. So benötigt ein ACTION-EDIT-Intent als data die URI, die auf das zu editierende Dokument verweist.
- Category – Ein String, der zusätzliche Informationen über die Art der Komponente enthält, welche den Intent empfangen soll. Es können mehrere Categories für einen Intent angegeben werden. Für die MainActivity unserer Finanz-App ist als Category in dem Intent Filter die CATEGORY_LAUNCHER angegeben. Somit ist die MainActivity die Start-Activity unserer App und in dem Application Launcher des Android Systems gelistet.
Die oben aufgeführten Eigenschaften (Component Name, Action, Data und Category) repräsentieren die Hauptmerkmale eines Intents. Das Android System kann durch Auswerten dieser Eigenschaften erkennen, welche App-Komponente durch den Intent gestartet werden soll.
Ein Intent-Objekt kann aber auch noch weitere zusätzliche Informationen beinhalten, die aber das Auflösen, welche App-Komponente gestartet werden soll, nicht beeinflussen.
Zusätzliche Intent-Informationen sind:
- Extras – Sind Schlüssel-Wert-Paare (key-value pairs), die zusätzliche Informationen enthalten, welche für die Ausführung der angefragten Aktion benötigt werden. Extra-Data wird mit der putExtra()-Methode dem Intent hinzugefügt. Dabei werden zwei Parameter übergeben, der Schlüsselname und der dazugehörige Wert. Möchte man bspw. einen impliziten Intent erzeugen, der die Aktion ACTION_SEND ausführt, kann man den Betreff (subject) mit dem Schlüssel EXTRA_SUBJECT spezifizieren.
- Flags – Sind Metadaten des Intents und in der Intent-Klasse definiert. Sie informieren das Android System wie es bspw. eine Activity starten soll oder wie es eine Activity behandelt, nachdem sie gestartet wurde (z.B. ob sie in der Liste der Recent Activities aufgenommen werden soll).
Ein Beispiel für einen impliziten Intent in Android?
Das folgende Code-Beispiel zeigt, wie ein impliziter ACTION_SEND-Intent erzeugt wird, mit dem eine Activity für das Versenden (Teilen) eines normalen Textes beim Android System angefragt wird. Wird die Methode startActivity() mit diesem Intent aufgerufen, erscheint ein Auswahldialog mit dem der Benutzer die App auswählen kann, die das Versenden durchführen soll.
Beispiel-Quellcode für den impliziten ACTION_SEND-Intent:
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); // "text/plain" MIME type // Sicherstellen, dass für den Intent eine Activity gefunden wurde if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent); }
In dem oberen Beispiel wurde keine URI als Data-Information angegeben, dafür aber der data type als HTTP.PLAIN_TEXT_TYPE festgelegt. Wodurch der zu übertragende Inhalt genauer spezifiziert wurde.
Wenn nun die Methode startActivity() aufgerufen wird, untersucht das Android System alle installierten Apps, um zu bestimmen welche App-Komponenten diese Art Intent ausführen können. Gesucht wird nach einer App-Komponente, die einen Intent mit der Aktion ACTION_SEND ausführen kann, bei dem als data type „text/plain“ übertragen werden soll.
Falls es nur eine App gibt, die diesen Intent ausführen kann, wir diese App sofort gestartet und ihr der Intent übergeben. Sollte es mehrere Apps geben, die in Frage kommen, öffnet das Android System einen Auswahldialog und der Benutzer muss entscheiden welche App für den Intent genutzt werden soll.
Es ist auch möglich, dass keine passende App für den auszuführenden impliziten Intent auf dem Android Gerät installiert ist. Falls dies so ist, so darf auf keinen Fall die Methode startActivity() aufgerufen werden. Da sonst die eigene App abstürzen würde. Daher muss vor dem Ausführen eines impliziten Intents immer mit der Methode resolveActivity() sichergestellt werden, dass eine Activity auf dem Gerät installiert ist, welche den impliziten Intent empfängt.
Falls der Rückgabewert der Methode resolveActivity() ungleich null ist, dann ist auf dem Gerät mindestens eine App installiert, die den Intent bearbeiten kann. Ist der Rückgabewert null, darf der Intent nicht gestartet werden und die Funktion sollte deaktiviert werden.
Viele weiterführende Informationen zu Intents in Android sind in dem Developer Guide an folgenden Stellen zu finden:
2. Bekannte implizite Intents in Android?
Mit Intents werden in Android Activities gestartet. Definiert man eine bestimmte Aktion, die ausgeführt werden soll, in dem Intent-Objekt, dann handelt es sich um einen impliziten Intent, mit dem eine Activity einer anderen App gestartet wird.
Da die fremde App-Komponente nicht exakt spezifiziert wird, muss das Android System nach der passenden Komponente suchen.
Dies ist nur möglich, wenn die gewünschte Aktion und hinterlegten Daten genau beschrieben werden.
Für jede im Android System mögliche Aktion sind diese Angaben exakt definiert, dadurch ist sichergestellt, dass auch die richtige App-Komponente für den impliziten Intent gefunden werden kann.
Wird eine der Methoden startActivity() oder startActivityForResult() aufgerufen und ihnen ein implizites Intent-Objekt übergeben, sucht das Android System nach der passenden App und startet deren entsprechende Activity. Sind mehrere Apps kompatibel, wird ein Auswahldialog angezeigt und der Benutzer entscheidet welche App den Intent ausführen soll.
Um einen impliziten Intent richtig verwenden zu können, müssen die Anforderungen an den Intent vorher bekannt sein. Die Anforderungen für bekannte und oft genutzte implizite Intents sind auf folgender Seite mit ausführlichen Beispielen aufgeführt:
Die folgenden App-Typen verarbeiten häufig genutzte impliziten Intents in Android weiter:
- Alarm Uhr
- Kalender
- Kamera
- Kontakte
- File-Storage
- Lokale Aktionen
- Karten
- Musik und Vidoe
- Telefon
- Suche
- Einstellungen
- Text-Nachrichten
- Web-Browsing
Der in diesem Android Tutorial benötige App-Typ ist auch mit aufgeführt. Um das, in unserer Finanz-App, ausgewählte Finanzinstrument mit zusätzlichen Informationen im Browser anzeigen zu lassen, benötigen wir eine Web-App (Web-Browsing), die unseren impliziten Intent weiter verarbeitet.
Die entsprechende Webseite lassen wir mit der Aktion ACTION_VIEW in einem Browser anzeigen. Dazu benötigen wir einen VIEW-Intent, der als Data URI-Information die URI der entsprechenden Webseite enthält.
Mit dem folgenden Beispiel-Quellcode wird ein VIEW-Intent erzeugt und die Webseiten-Information als Data URI Scheme als URI im Intent-Objekt hinterlegt:
// Erzeugen des Data-URI Scheme für die anzuzeigende Webseite // Mehr Infos auf der "Common Intents" Seite des Android Developer Guides: // http://developer.android.com/guide/components/intents-common.html#Browser Uri webseite = Uri.parse(url); // Erzeugen eines impliziten View-Intents mit der Data URI-Information Intent intent = new Intent(Intent.ACTION_VIEW, webseite); // Prüfen ob eine Web-App auf dem Android Gerät installiert ist // und Starten der App mit dem oben erzeugten impliziten View-Intent if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }
Mit der Anweisung in Zeile 12 übergeben wir den VIEW-Intent an die Methode startActivity(). Das Android System sucht dann nach einer installierten Web-App und übergibt dieser unseren Intent.
Soviel zum Theorie-Teil dieser Android Tutorial Lektion. In den nächsten Abschnitten werden wir unsere Android Anwendung erweitern. Dazu werden wir einen neuen Menüeintrag in die Action Bar einfügen und über diesen den impliziten VIEW-Intent ausführen.
3. Neuen Menüeintrag in das Options Menu der Action Bar einfügen und Definieren der String-Konstante
Unsere Android App soll die ausgewählte Aktie auf Yahoo! Finance im Browser anzeigen. Dafür möchten wir die Web-Funktionalität einer anderen App nutzen, bspw. von der Google Chrome App.
Da wir nicht wissen welche Web-Apps auf dem Android Gerät unserer Benutzer installiert sind, werden wir unser gewünschtes Vorhaben mit einem impliziten Intent umsetzen.
Der implizite Intent soll durch einen neuen Menüeintrag im Menü der AktiendetailActivity gestartet werden können.
Um den Menüeintrag in das Options Menu der Action Bar einzufügen, sind die folgenden beiden Schritte notwendig:
- Definieren der String-Konstante in der
strings.xml
Ressourcen-Datei - Definieren des Menüeintrags in der XML-Layout Datei
menu_aktiendetail.xml
3.1 Definieren der String-Konstante in der strings.xml Ressourcen-Datei
Der erste Schritt ist schnell gemacht. Wir öffnen zunächst die Ressourcen-Datei strings.xml
, die sich in dem res/values
Verzeichnis unseres Android Projekts befindet, und fügen einen Bezeichner für den neuen Menüeintrag ein.
In die strings.xml
Datei fügen wir folgende Zeile ein:
strings.xml
<string name="action_starte_browser">Mehr Infos anzeigen</string>
In Android Studio sieht die strings.xml
Datei nun folgendermaßen aus:
Auf die neu definierte String-Konstante werden wir im nächsten Schritt von der menu_aktiendetail.xml
XML-Layout Datei verweisen. Dadurch sind wir in der Lage die Bezeichnung für den Menüeintrag schnell zu ändern oder ihn in andere Sprachen zu übersetzen.
3.2 Definieren des Menüeintrags in der XML-Layout Datei menu_aktiendetail.xml
Als nächsten Schritt fügen wir einen weiteren Menüeintrag in das Options Menu unserer AktiendetailActivity ein. Dazu öffnen wir die XML-Layout Datei menu_aktiendetail.xml
, die in dem res/menu
Verzeichnis liegt.
In den vorhanden Quellcode fügen wir folgende Zeilen ein:
menu_aktiendetail.xml
<item android:id="@+id/action_starte_browser" android:title="@string/action_starte_browser" android:orderInCategory="99" app:showAsAction="never"/>
Die angegebenen id ermöglicht uns später diesen Menüeintrag in der Ressourcen-Datei R
zu finden. Den title setzen wir nicht statisch, sondern verweisen auf die, im vorherigen Schritt definierte, String-Konstante.
Mit dem Attribut orderInCategory legen wir die Reihenfolge der Menüeinträge fest. Menüeinträge mit niedrigen Werten werden weiter oben angeordnet. Mit dem letzten Attribut showAsAction legen wir fest, dass dieser Menüeintrag nicht in der Action Bar sichtbar ist, sondern dem Overflow Menu hinzugefügt wird.
Weitere, sehr detaillierte Infos über eine Menu-Resource in Android könnt ihr hier finden.
In Android Studio sieht die menu_aktiendetail.xml
Datei nun folgendermaßen aus:
Das waren auch schon die beiden notwendigen Schritte, um einen neuen Menüeintrag in die Action Bar unserer AktiendetailActivity einzufügen. Als Nächstes möchten wir den neuen Menüeintrag dafür nutzen mittels impliziten Intent eine Web-App in Android zu starten.
4. Mit impliziten Intent eine andere App in Android starten
Der neue Menüeintrag der AktiendetailActivity ist jetzt in dem Options Menu der Action Bar integriert. Im Moment besitzt er jedoch noch keine Funktionalität, dies werden wir nun ändern.
Dazu sind die folgenden Schritte notwendig:
- Erweitern der onOptionsItemSelected() Methode, um zu überwachen, ob der neue Menüeintrag angeklickt wurde und entsprechend zu reagieren.
- Definieren der Methode zeigeWebseiteImBrowser(), mit der wir den impliziten Intent erzeugen und an das Android System weitergeben.
- Ergänzen der benötigten Import-Anweisungen.
Alle Änderungen nehmen wir in der AktiendetailActivity-Klasse unseres Android Projekts vor.
4.1 Erweitern der onOptionsItemSelected() Methode
Zunächst öffnen wir die Klasse AktiendetailActivity.java
, die sich in dem Package-Ordner unseres Android Projekts befindet. Darin scrollen wir bis zu der Methode onOptionsItemSelected(), mit deren Hilfe wir auf Klicks auf Einträge des Options Menu reagieren können.
In die Methode onOptionsItemSelected() fügen wir folgenden Codeblock vor der return-Anweisung ein:
AktiendetailActivity.java
if (id == R.id.action_starte_browser) { zeigeWebseiteImBrowser(); return true; }
Mit der if-Anweisung prüfen wir, ob der Menüeintrag mit der ID R.id.action_starte_browser
angeklickt wurde. Diesen Menüeintrag haben wir im vorherigen Abschnitt definiert. Wenn er angeklickt wurde, wird die Methode zeigeWebseiteImBrowser() aufgerufen, die wir im nächsten Schritt anlegen werden.
Weitere Informationen über das Options Menu und die Action Bar in Android könnt ihr in Teil 6 unseres Android Tutorials finden.
4.2 Definieren der zeigeWebseiteImBrowser() Methode und Starten des impliziten Intents
Als Nächstes legen wir eine neue Methode in der AktiendetailActivity-Klasse an. Die neue Methode wird den impliziten Intent erzeugen und ihm die URL für die ausgewählte Aktie als Data URI Scheme zuweisen. Anschließend wird der erstellte implizite Intent der Methode startActivity() übergeben und damit vom Android System die passende Web-App aufgerufen.
Mit dem folgenden Quelltext definieren wir die neue Methode zeigeWebseiteImBrowser():
AktiendetailActivity.java
private void zeigeWebseiteImBrowser(){ String webseitenURL = ""; // Die AktiendetailActivity wurde über einen Intent aufgerufen // Wir lesen aus dem empfangenen Intent die übermittelten Daten aus // und bauen daraus die URL der aufzurufenden Webseite Intent empfangenerIntent = this.getIntent(); if (empfangenerIntent != null && empfangenerIntent.hasExtra(Intent.EXTRA_TEXT)) { String aktienInfo = empfangenerIntent.getStringExtra(Intent.EXTRA_TEXT); int pos = aktienInfo.indexOf(":"); String symbol = aktienInfo.substring(0, pos); webseitenURL = "http://finance.yahoo.com/q?s=" + symbol; } // Erzeugen des Data-URI Scheme für die anzuzeigende Webseite // Mehr Infos auf der "Common Intents" Seite des Android Developer Guides: // http://developer.android.com/guide/components/intents-common.html#Browser Uri webseitenUri = Uri.parse(webseitenURL); // Erzeugen eines impliziten View-Intents mit der Data URI-Information Intent intent = new Intent(Intent.ACTION_VIEW, webseitenUri); // Prüfen ob eine Web-App auf dem Android Gerät installiert ist // und Starten der App mit dem oben erzeugten impliziten View-Intent if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { String LOG_TAG = AktiendetailActivity.class.getSimpleName(); Log.d(LOG_TAG, "Keine Web-App installiert!"); } }
In den Zeilen 8 bis 15 setzen wir die URL der aufzurufenden Webseite zusammen. Dazu lesen wir aus dem empfangenen Intent die übermittelten Daten aus und bestimmen das Aktien-Symbol.
Mit dem konstruierten Webseiten-String erzeugen wir in Zeilen 20 die Data URI für den impliziten Intent. Eine genaue Beschreibung der möglichen Data URI Schemes findet ihr hier.
Als Nächstes erstellen wir den impliziten Intent. In Zeile 23 erzeugen wir das Intent-Objekt und weisen ihm die Aktion ACTION_VIEW und die URI der aufzurufenden Webseite zu.
Damit ist der implizite Intent vollständig erstellt und kann zum Aufrufen der anderen Web-App verwendet werden. Da wir aber nicht wissen, ob auf dem Android Gerät unseres Nutzers eine passende Web-App installiert ist, können wir den Intent nicht einfach starten. Würde nämlich keine Web-App installiert sein, würde ein Starten des Intents zum Absturz unserer Finanz-App führen.
Damit dies nicht passiert, prüfen wir in Zeile 27 zur Laufzeit, ob eine, zu unserem impliziten Intent, passende App-Komponente auf dem Android Gerät gefunden wurde (also installiert ist). Ist eine passende App installiert, lassen wir diese vom Android System starten, indem wir die Methode startActivity() aufrufen und ihr unseren impliziten Intent übergeben. Den Rest übernimmt das Android System für uns.
Falls keine Web-App auf dem Android Gerät installiert ist, lassen wir mit den Zeilen 30 und 31 eine LOG-Meldung ausgeben, die uns über das Problem informiert.
4.3 Ergänzen der benötigten Import-Anweisungen
Da wir in dem oberen Quelltext einige zusätzliche Klassen bzw. Interfaces benutzen, müssen wir diese noch mit Hilfe von Import-Anweisungen bekannt machen.
Dazu fügen wir folgende Import-Anweisungen in die AktiendetailActivity-Klasse ein:
AktiendetailActivity.java
import android.content.Intent; import android.net.Uri; import android.util.Log;
In Android Studio sollte die Datei AktiendetailActivity.java jetzt wie folgt erweitert worden sein:
Der blau markierte Codeblock A beinhaltet den Quellcode von Schritt 1. In Codeblock B ist der Quellcode von Schritt 2 enthalten.
Der Import-Block ist in der oberen Abbildung nicht enthalten. Es muss dennoch wie oben beschrieben ergänzt werden.
5. Testen unserer Android App und Starten einer anderen App (Web-App) mit Hilfe des impliziten Intents
Alle notwendigen Änderungen an den Quelltexten unseres Android Projekts sind vorgenommen. Nun wollen wir unsere App testen. Dazu installieren wir die Anwendung auf unser angeschlossenes Android Gerät (Smartphone oder Tablet) und lassen sie dort ausführen.
Um die App auf dem Android Gerät starten zu können, müssen alle Schritte von Teil 3 des Android Tutorials befolgt worden sein.
Hier noch einmal in Kürze die wichtigsten Arbeitsschritte.
Zuerst schließen wir unser Android Gerät an den PC an und stellen eine Verbindung über die ADB (Android Debug Bridge) her. Danach klicken wir auf das Run 'app'
-Symbol. Unser Android Projekt wird dadurch neu erstellt und auf dem angeschlossenen Gerät ausgeführt.
Das Run 'app'
-Symbol befindet sich in der oberen Menüleiste, siehe folgende Abbildung:
Nach einigen Momenten öffnet sich der Choose Device
-Dialog. In ihm nehmen wir die folgenden Einstellungen vor:
- Radio Button
Choose a running device
aktivieren - Das angeschlossene Android Gerät auswählen
- Mit einem Klick auf den
OK
-Button die Installation unserer App auf das Gerät starten
Der Dialog schließt sich und unsere Android App wird auf das angeschlossene Gerät übertragen und installiert. Die Installation dauert nur einen kurzen Augenblick und verläuft fast unbemerkt im Hintergrund. Danach wird unsere App automatisch gestartet.
5.1 Testen des impliziten Intents unserer Android App
Die untere Abbildung zeigt wie mit dem neuen Menüeintrag mittels impliziten Intent eine andere Web-App gestartet wird und diese für uns weitere Informationen über die ausgewählte Aktie auf der entsprechenden Webseite von Yahoo! Finance anzeigt:
Auf dem von uns benutzten Android Gerät, ein Samsung Galaxy S4 mini, sind als Web-Apps Google Chrome und eine weitere Internet-App installiert. Durch ausführen des impliziten Intents wird daher ein Auswahldialog angezeigt, mit dem wir den Vorgang abschließen können und das Android System die ausgewählte Web-App starten und ihr den Intent übergeben kann.
Der Intent enthält die Uri zur aktuell ausgewählten Aktie, wodurch die Web-App in der Lage ist diese auf Yahoo! Finance anzuzeigen.
5.2 Video – Aufrufen einer Web-App mittels impliziten Intent
Nun möchten wir unsere Android App auch einmal in der aktuellen Entwicklungsstufe im Video sehen. Dazu haben wir das folgende kurze Video erstellt, in dem die neue Funktion unserer App vorgestellt wird:
In dem oberen Video wählen wir ein Finanzinstrument aus der angezeigten Indizeliste aus und lassen uns dadurch den Aktiendetail Bildschirm öffnen.
Um zu testen, ob der implizite VIEW-Intent korrekt funktioniert, lassen wir uns über den neuen Menüeintrag Mehr Infos anzeigen das ausgewählte Finanzinstrument auf Yahoo! Finance in einer Web-App anzeigen.
Mit einem Klick auf den neuen Menüeintrag wird der implizite Intent erstellt und an das Android System übergeben. Das System sucht für uns nach einer passenden Web-App und zeigt uns einen Auswahldialog, in welchem wir die gewünschte Web-App auswählen müssen. Anschließend startet das Android System die ausgewählte App automatisch.
Da auf unserem Test-Smartphone als Web-App Google Chrome und die Internet-App installiert sind, erscheinen beide im Auswahldialog. Der ausgewählten App wird der erstellte implizite Intent übergeben, damit sie in der Lage ist die entsprechende Webseite auszulesen und anzuzeigen.
Zusammenfassung
In der zwölften Lektion unseres großen Android Tutorials haben wir implizite Intents ausführlich kennengelernt. Nach einem ausgiebigen Theorie-Teil haben wir einen impliziten VIEW-Intent erzeugt.
Der erstellte implizite Intent führt eine ACTION_VIEW-Aktion aus und besitzt als hinterlegte Daten eine Data URI, welche auf die Webseite von Yahoo! Finance verweist und nach dem Data URI Scheme formatiert wurde.
Um den impliziten Intent ausführen zu können, haben wir einen weiteren Menüeintrag in das Options Menu der Action Bar eingefügt. Wird auf den neuen Menüeintrag geklickt, erzeugen wir den impliziten Intent und übergeben ihn der startActivity()-Methode. Den Rest übernimmt für uns das Android System, das nach der zu dem VIEW-Intent passenden Web-App sucht und diese anschließend aufruft.
Am Ende der Lektion haben wir unsere Android App getestet und im Video einen Indize in einer Web-App anzeigen lassen. In der nächsten Lektion werden wir unserer Android Anwendung einen shareActionProvider hinzufügen, wodurch das Teilen von Inhalten ermöglicht wird.