Wie implementieren Android-Apps die Schaltfläche "Teilen"?

11

Ich habe mich gefragt, wie Android-Anwendungen und Android den Share-Button und den Share-Mechanismus implementieren. Wenn ich beispielsweise auf YouTube auf die Schaltfläche "Teilen" klicke, wird eine Liste der Apps angezeigt, die für die Freigabe freigegeben werden sollen. Wie wird diese Liste ermittelt? Gibt es eine bestimmte "Teilen" -Absicht, und dann werden alle Stellen angezeigt, die in der Lage sind, die in den Absichts-Extras angegebene Absicht zu teilen? Wie lautet der technische Name des Entwurfsmusters, mit dem dies implementiert wird? Vielen Dank.

Jack Maddington
quelle
1
Meinten Sie wirklich "Poops" oder ist das ein Tippfehler für "Pops"? Zumindest im amerikanischen Englisch ist das erstere das, was Babys mit ihren Windeln machen.
JDługosz
Du hast recht. Ich habe kürzlich auf die Swype-Tastatur unter Android umgestellt, mit der ich schneller tippen kann, aber gelegentlich wird das falsche Wort für eingegeben, und ich merke es nicht. Ich bin mir noch nicht sicher, was ich dagegen tun soll, ich bin keine sehr vorsichtige Person. Manchmal im Sub und kann den Bildschirm nicht einmal richtig sehen.
Jack Maddington
Im U-Boot (U-Boot?)! Was zu tun ist: Korrekturlesen vor dem Absenden. Und verschmutzen Sie Ihre Vorhersageliste nicht mit peinlichen Worten.
JDługosz
Zufälligerweise ist meine Vorhersageliste mit Dingen aus alten E-Mails gefüllt, die Swype automatisch liest. Huch!
Jack Maddington

Antworten:

10

Dies besteht aus zwei Teilen: dem Mechanismus, mit dem die Kommunikations-Apps sagen, dass sie Dinge teilen können, und dem Mechanismus, mit dem die Apps Inhalte teilen können. Ich werde mich nacheinander mit ihnen befassen, aber zuerst eine kurze Anmerkung zu den Absichten .

Absichten

Die Absicht in Android ist, was zum Starten einer App verwendet wird. Es kann wie eine Verknüpfung oder wie eine Windows-Dateizuordnung funktionieren. Die Absicht kann den Namen der zu startenden App angeben, muss dies aber nicht. Es kann auch die auszuführende Aktion (z. B. "Hauptaktivität öffnen", "Diese URL anzeigen", "Kalendereintrag erstellen") und den MIME-Typ des Objekts angeben, auf das es angewendet werden soll (z. B. das Objekt, das Sie anzeigen möchten hat Typ image / jpeg). Einige Namen von Aktionen sind spezifisch für eine bestimmte App, aber viele sind von Android standardisiert, damit Apps interagieren können.

Absichtsfilter und Kommunikations-App

Jede App gibt Absichtsfilter an, um anzugeben , welche Art von Aktionen sie ausführen kann. Beispiel: Eine Bildbetrachter-App registriert einen Absichtsfilter für "Diese URL anzeigen", wobei der MIME-Typ "Bild / *" lautet. Ein Webbrowser würde einen Absichtsfilter für "Diese URL anzeigen" registrieren, wobei das URL-Schema "http" oder "https" lautet. Um Dinge teilen zu können, registriert eine App einen Absichtsfilter für die "Sende" -Absicht, entweder mit einem bestimmten Typ (z. B. wenn nur Fotos geteilt werden können) oder für einen beliebigen Typ.

Inhalts-App

Die App, die Inhalte freigeben möchte, erstellt eine Absicht mit der Aktion "Freigeben" und einer URL, die auf den freizugebenden Inhalt verweist. (Dies ist häufig eine "temporäre" URL, die der empfangenden App temporären Zugriff auf die Datei im privaten Speicher der Inhalts-App oder auf einen von der Inhalts-App generierten Stream gewährt.) Sie gibt nicht den Namen einer App an, mit der die App verarbeitet werden soll Absicht. Anschließend gibt es dem Android-Framework diese Absicht und fordert Android auf, den Auswahldialog anzuzeigen . Android vergleicht die Absicht mit den Absichtsfiltern aller installierten Apps, erstellt die Liste und zeigt sie dem Benutzer an. Wenn der Benutzer eine bestimmte App auswählt, startet Android diese App und übergibt ihr die Absicht. Die App verwendet die URL, um den Inhalt der ursprünglichen App abzurufen.

Neu in Marshmallow: Direct Share

In Marshmallow gibt es einen anderen Mechanismus namens Direct Share . Dies ergänzt den Absichtsmechanismus, sodass Sie Personen oder Gruppen auswählen können, die Sie direkt im Auswahldialog freigeben möchten, und den zusätzlichen Schritt "An wen möchten Sie ihn senden?" Überspringen. Dies funktioniert etwas anders: Die Kommunikations-App muss einen Dienst bereitstellen. Wenn die App mit dem Inhalt nach einer Auswahl fragt, startet Android den Dienst für jede relevante App. Der Dienst gibt eine Liste relevanter Freigabeziele zurück , und Android fügt alle diese separaten Listen zu der Liste zusammen, die im Dialogfeld angezeigt wird.

Dan Hulme
quelle
Aber ich habe gesehen, dass Apps einige verschiedene Auswahldialoge zeigen. Werden sie alle wirklich vom Betriebssystem angezeigt oder kann die App selbst eine Liste der Ziele abrufen?
user1686
@grawity Das integrierte Dialogfeld verfügt über einige Anpassungsoptionen (z. B. zum Festlegen des Titels). Es ist jedoch auch möglich, dass die App Android nach der Liste der Freigabeziele fragt und diese in ein eigenes Dialogfeld einfügt. Die BURLy-Auswahl meines Browsers ist ein Beispiel dafür, jedoch mit der Absicht "URL öffnen" anstelle der Absicht "Senden".
Dan Hulme
11

Ich bin kein Entwickler, daher kann ich nur eine Manifestgrobe Erklärung geben: Apps geben an, in welchen Mimetypen sie verstehen und bereit sind, auf Freigabeaktionen zu reagieren. Dazu definieren sie sogenannte "Intent-Filter", zB:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/*" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="message/*" />
    <data android:mimeType="multipart/*" />
    <data android:mimeType="text/*" />
    <data android:mimeType="video/*" />
</intent-filter>

Wenn Sie also auf die Schaltfläche "Teilen" klicken, wird der zu teilende Inhalt ausgewertet und mit Apps abgeglichen, die ihre Bereitschaft zum Empfang des Formats erklärt haben.

Quellen:

Izzy
quelle
1
Das ist so ziemlich alles direkt. Die App (die das Teilen durchführt) selbst kann einige der absichtlichen Befragten filtern, die meisten jedoch nicht.
Coteyr
2
@HiltonShumway deshalb habe ich seine Antwort positiv bewertet. Anders als ich ist Dan fit in der Entwicklung und weiß viel besser, wie die Dinge zusammenpassen. Als ich meine Antwort veröffentlichte, hoffte ich, dass er auch eine veröffentlichen würde - er hat meine Hoffnung nicht enttäuscht :)
Izzy