Funktionsweise von Implicit Intents

oetzi

oetzi

Fortgeschrittenes Mitglied
11
Hallo zusammen,

ich arbeite mich gerade in die Android Entwicklung ein und hänge gerade an den Implicit Intents.

Mein bisheriges Verständnis sieht so aus:
- Da andere Entwickler nicht die Klassennamen der Ziel-Activity kennen, müssen überhaupt implicit Intents verwendet werden. Intern kann ich ja einfach explicit Intents verwenden indem ich die Activity über den Klassennamen aufrufe.
- Eine Activity bietet über einen Intent-Filter dann überhaupt erstmal die Möglichkeit an von außen aufgerufen zu werden

Aber wie genau funktionert es, dass eine Activity merkt, dass sie gemeint ist?
Folgendes Beispiel habe ich gerade aus einem Android Buch abgeschrieben und ausprobiert:

Manifest:
Code:
        <activity android:name=".ShowProductsOfShoppingList"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="de.androidtest.intent.action.SHOW_PRODUCTS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
So soll dieser Intent laut dem Buch aufgerufen werden können:

Code:
        Intent i = new Intent("de.androidtest.intent.action.SHOW_PRODUCTS");
        i.putExtra("shoppinglist_id", 1);
        startActivity(i);
Das funktioniert zwar, aber mir fällt auf, dass ich jetzt doch genau den Package-Namen, etc. aus dem Manifest angeben muss. Diese Details kennt ein externer Entwickler doch gar nicht?! (s.o.)

Wie soll das also genau funktionieren? Was müsste ich einem externen Entwickler mitteilen, damit er meine Activity aufrufen kann?

Schönen Gruß,
oetzi
 
Ein Entwickler muss genau dein "de.androidtest.intent.action.SHOW_PRODUCTS" kennen.

Diese Intent-Namen kennst du auch von anderen - bzw. die Standard-Intents wie z.B. "android.intent.action.VIEW" - das ist der Name, der hinter der Konstanten "Intent.ACTION_VIEW" steht. Zusätzlich zu dem Namen kannst du auch nach dem Inhalt (also der URI) Filtern - z.B. kannst du einen ACTION_VIEW Intent schreiben, der auf alles hört was mit ht*p://w*w.youtube.com anfängt - genau so macht es die YouTube-App von Google und fragt dich bei Youtube-Links. Dann wird der Benutzer von dem "Intent-Chooser" gefragt, mit welchem Programm der Intent behandelt werden soll - mit deinem Browser oder mit "YouTube".

edit:
Und in deinem Beispiel müsstest du natürlich auch die Parameter (shoppinglist_id) veröffentlichen, die man mitteilen kann - und in der Activity, die auf den Intent horcht behandeln wenn dieser nicht angegeben wird. Die Intents von Google-Programmen findest du hier:
http://developer.android.com/guide/appendix/g-app-intents.html
 
Hi sixi,
danke für deine Antwort!
Ein Entwickler muss genau dein "de.androidtest.intent.action.SHOW_PRODUCTS" kennen.
mhh, und warum nimmt man dann nicht direkt explizite Intents? Macht es denn einen Unterschied, ob ich jetzt den Namen des Filters (implizit) oder die Klasse (explizit) bekannt mache. Anscheinend ist mir der tatsächliche Unterschied zwischen den impliziten und expliziten Intens doch noch nicht ganz klar...


Hab mir grad mal die verlinkte Seite angeguckt. Sehe ich das richtig? Der Intent Name VIEW (bzw. "android.intent.action.VIEW") ist für verschiedene Zwecke zu nutzen und es wird nur anhand der übergebenen Parameter entschieden, ob jetzt der Browser, googleMaps oder googleStreetView aufgerufen wird?
mhh, auch hier sehe ich irgendwie denn Sinn noch nicht.
Ich weiß doch in meinem Programm, ob ich einfach eine normale Internetadresse habe, die über den Browser geöffnet werden soll, oder ob ich gerade Koordinaten habe, die mir bei googleMaps angezeigt werden sollen. Oder was für Vorteile bietet es, dass man das so "schwammig" konstruiert?

mhh okay, mir fällt da gerade was ein. Ein ähnliches Beispiel, wie dein youtube Beispiel. Als ich auf meinem SGS einen alternativen PDF Reader installiert habe, kam danach jedes Mal dieser "Intent-Chooser", wenn ich im Dateisystem auf ein PDF geklickt habe. Sehe ich das richtig, dass in dem Moment wo ich auf das PDF klicke vom System ein Intent Aufruf statt findet in die Richtung: "Hellas, gibt es hier wen, der mir ein PDF öffnen kann?" Und wenn dann der Intent Filter von dem alternativ PDF-Reader genauso gestaltet ist wie der systemeigene, kommt der Intent bei beiden an?!
 
Naja, wenn du eine 2. Galerie hast fragt er dich mit welcher er das Bild öffnen soll. Oder mit welchem Video Player er das Video wiedergeben soll.
Wäre der Weg hier vorgegeben wäre Android deutlich schlechter anpassbar.


Zum PDF Beispiel :genau so funktioniert das ;)
 
mhh, ja sehe ich ein :)

Danke!
 

Ähnliche Themen

S
Antworten
17
Aufrufe
552
jogimuc
J
5
Antworten
22
Aufrufe
1.418
590239
5
M
Antworten
4
Aufrufe
1.169
swa00
swa00
Zurück
Oben Unten