Freitag, 22. März 2013

Widgets

Neulich habe ich mich mit dem Thema Widget in Android auseinander gesetzt. Da ich bisher noch nichts mit Widgets gemacht hatte, schien es mir sinnvoll einen kurzen Post dazu zu schreiben:

Ein Widget in Android ist quasi ein Broadcast-Receiver, der im Manifest angemeldet wird. Das erwähne ich hier gleich als Erstes, da ich mir das Widget wie eine Art Fragment bzw. Activity vorgestellt hatte, also mit einem eigenen Lifecycle. Das ist aber nicht so! Ein BroadcastReceiver "lebt" quasi so lange, wie seine onReceive() Methode aufgerufen wird. D.h. konkret, dass keine Daten dauerhaft in meinem BroadcastReceiver gespeichert werden (das kann damit gelöst werden, indem die Daten entweder in einer DB, auf der Festplatte gespeichert werden oder einfach in den System Properties abgespeichert werden). Aber erst mal eins nachdem anderen:

  • Damit ein App-Widget existieren kann, werden folgende Objekte benötigt:
    • AppWidgetProviderInfo -> beschreibt die Meta-Daten für das Widget (Layout, Häufigkeit von Updates usw.)
    • AppWidgetProvider -> das ist unser "BroadcastReceiver" (hier werden die Funktionen definiert, die ausgeführt werden, wenn ein Button im Widget angeklickt wurde)
    • Widget Layout
    • AppWidgetConfigure -> muss der User, bevor er das Widget nutzen kann, Einstellungen vornehmen, so können diese in einer gesonderten Activity durchgeführt werden. Werden keine Einstellungen benötigt, so kann dieser Teil ignoriert werden
  • Eine gute Anleitung ist auf der Android-Developer Seite zu finden
  • Hier möchte ich nur eine kleine Liste der wichtigen Punkte erwähnen, die für ein funktionsfähiges Widget benötigt werden
    • zunächst sollte das Widget im Manifest deklariert werden (-> siehe Anleitung)

    • als nächstes werden die AppWidgetProviderInfos in einem Unterordner der Resourcen erstellt (-> res/xml)

    • dann wird das App-Widget Layout erstellt (-> hierzu auf jeden Fall den Widget-Layout Abschnitt in der Anleitung durchlesen, da nicht alle Elemente von einem Widget unterstützt werden, Bsp.: EditText)
    • zum Schluß wird der Provider (-> also der BroadcastReceiver) erzeugt

    • Optional kann am Ende die AppWidgetConfigure Activity initialisiert werden (diesen Punkt lasse ich aber vorerst mal weg)
Nachdem man nun weiß wie ein App-Widget erstellt wird wäre es noch schön zu wissen, wie die Kommunikation in so einem Widget aussieht. Grundsätzlich läuft die Kommunikation mit Hilfe von PendingIntents (grob: Kombination aus einem Intent und den entsprechenden Ziel, wobei Ziel eine Activity/ Fragment oder das Widget selbst sein kann) ab. Hierzu habe ich mir mal ein paar Fälle überlegt die eintreten könnten und wie dann die entsprechende Kommunikation aussieht:
  • Kommunikation innerhalb des Widgets (es wird ein Button gedrückt und dieser aktualisiert den Inhalt des Widgets)

  • Kommunikation zwischen Widget und App
    • Widget initialisiert App

    • App erzwingt ein Update des Widgets

Viel Spaß beim ausprobieren!

Keine Kommentare:

Kommentar veröffentlichen