1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Funktionsweise von Implicit Intents

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von oetzi, 01.09.2011.

  1. oetzi, 01.09.2011 #1
    oetzi

    oetzi Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    148
    Erhaltene Danke:
    8
    Registriert seit:
    25.02.2011
    Phone:
    Samsung Galaxy S5+
    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
     
  2. sixi, 01.09.2011 #2
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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
     
  3. oetzi, 01.09.2011 #3
    oetzi

    oetzi Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    148
    Erhaltene Danke:
    8
    Registriert seit:
    25.02.2011
    Phone:
    Samsung Galaxy S5+
    Hi sixi,
    danke für deine Antwort!
    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?!
     
  4. the_alien, 01.09.2011 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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 ;)
     
  5. oetzi, 02.09.2011 #5
    oetzi

    oetzi Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    148
    Erhaltene Danke:
    8
    Registriert seit:
    25.02.2011
    Phone:
    Samsung Galaxy S5+
    mhh, ja sehe ich ein :)

    Danke!
     

Diese Seite empfehlen