Einfuehrung in die Androidprogrammierung
Einfuehrung in die Androidprogrammierung
Einfuehrung in die Androidprogrammierung
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Android-ProgrammierungmitEclipse<br />
Andreas Wilhelm<br />
Institut für Informatik<br />
Georg-August-Universität Gött<strong>in</strong>gen<br />
10. Oktober 2012<br />
1/34
Inhaltsverzeichnis<br />
1 Eclipse&AndroidSDK<br />
2 Aufbaue<strong>in</strong>er Applikation<br />
3 Komponenten<strong>in</strong>Android<br />
4 Widgets<br />
5 Android4<br />
2/34
Eclipse&Android<br />
Android SDK<br />
Eclipse<br />
Das ADT Plug<strong>in</strong><br />
Der Emulator<br />
3/34
Eclipse&Android<br />
Geme<strong>in</strong>same Oberfläche für verschiedene Entwicklungstools<br />
Basis für Android-Entwicklung – Android Software Development Kit (SDK)<br />
http://developer.android.com/sdk/<br />
E<strong>in</strong>b<strong>in</strong>dung <strong>in</strong> Eclipse über das ADT-Plug<strong>in</strong><br />
http://developer.android.com/tools/sdk/eclipse-adt.html<br />
4/34
Eclipse&Android<br />
Geme<strong>in</strong>same Oberfläche für verschiedene Entwicklungstools<br />
Basis für Android-Entwicklung – Android Software Development Kit (SDK)<br />
http://developer.android.com/sdk/<br />
E<strong>in</strong>b<strong>in</strong>dung <strong>in</strong> Eclipse über das ADT-Plug<strong>in</strong><br />
http://developer.android.com/tools/sdk/eclipse-adt.html<br />
4/34
Eclipse&Android<br />
Geme<strong>in</strong>same Oberfläche für verschiedene Entwicklungstools<br />
Basis für Android-Entwicklung – Android Software Development Kit (SDK)<br />
http://developer.android.com/sdk/<br />
E<strong>in</strong>b<strong>in</strong>dung <strong>in</strong> Eclipse über das ADT-Plug<strong>in</strong><br />
http://developer.android.com/tools/sdk/eclipse-adt.html<br />
4/34
Eclipse&Android<br />
Geme<strong>in</strong>same Oberfläche für verschiedene Entwicklungstools<br />
Basis für Android-Entwicklung – Android Software Development Kit (SDK)<br />
http://developer.android.com/sdk/<br />
E<strong>in</strong>b<strong>in</strong>dung <strong>in</strong> Eclipse über das ADT-Plug<strong>in</strong><br />
http://developer.android.com/tools/sdk/eclipse-adt.html<br />
4/34
Eclipse&Android<br />
Geme<strong>in</strong>same Oberfläche für verschiedene Entwicklungstools<br />
Basis für Android-Entwicklung – Android Software Development Kit (SDK)<br />
http://developer.android.com/sdk/<br />
E<strong>in</strong>b<strong>in</strong>dung <strong>in</strong> Eclipse über das ADT-Plug<strong>in</strong><br />
http://developer.android.com/tools/sdk/eclipse-adt.html<br />
4/34
Das Android SDK<br />
Stellt Bibliotheken zur Android-Entwicklung zur Verfügung<br />
Zusätzliche Entwicklertools zum Testen & Debuggen<br />
Installer für W<strong>in</strong>dows & L<strong>in</strong>ux 32-bit verfügbar<br />
Unter L<strong>in</strong>ux 64-bit muss ia32-libs Paket <strong>in</strong>stalliert werden<br />
5/34
Das Android SDK<br />
Stellt Bibliotheken zur Android-Entwicklung zur Verfügung<br />
Zusätzliche Entwicklertools zum Testen & Debuggen<br />
Installer für W<strong>in</strong>dows & L<strong>in</strong>ux 32-bit verfügbar<br />
Unter L<strong>in</strong>ux 64-bit muss ia32-libs Paket <strong>in</strong>stalliert werden<br />
5/34
Das Android SDK<br />
Stellt Bibliotheken zur Android-Entwicklung zur Verfügung<br />
Zusätzliche Entwicklertools zum Testen & Debuggen<br />
Installer für W<strong>in</strong>dows & L<strong>in</strong>ux 32-bit verfügbar<br />
Unter L<strong>in</strong>ux 64-bit muss ia32-libs Paket <strong>in</strong>stalliert werden<br />
5/34
Das Android SDK<br />
Stellt Bibliotheken zur Android-Entwicklung zur Verfügung<br />
Zusätzliche Entwicklertools zum Testen & Debuggen<br />
Installer für W<strong>in</strong>dows & L<strong>in</strong>ux 32-bit verfügbar<br />
Unter L<strong>in</strong>ux 64-bit muss ia32-libs Paket <strong>in</strong>stalliert werden<br />
5/34
DerEmulator<br />
Simulation der Applikation unter verschiedenen Android Versionen<br />
Testen der Applikation bei verschiedenen Auflösungen<br />
Konfiguration verschiedener Geräte-Typen (Motorrola, HTC, ...)<br />
Verwalten verschiedener Konfigurationen über den<br />
Android-Virtuell-Device-(AVD)-Manager<br />
Automatisches Kompilieren, Uploaden und Starten der Applikation auf dem<br />
Emulator aus Eclipse heraus<br />
6/34
DerEmulator<br />
Simulation der Applikation unter verschiedenen Android Versionen<br />
Testen der Applikation bei verschiedenen Auflösungen<br />
Konfiguration verschiedener Geräte-Typen (Motorrola, HTC, ...)<br />
Verwalten verschiedener Konfigurationen über den<br />
Android-Virtuell-Device-(AVD)-Manager<br />
Automatisches Kompilieren, Uploaden und Starten der Applikation auf dem<br />
Emulator aus Eclipse heraus<br />
6/34
DerEmulator<br />
Simulation der Applikation unter verschiedenen Android Versionen<br />
Testen der Applikation bei verschiedenen Auflösungen<br />
Konfiguration verschiedener Geräte-Typen (Motorrola, HTC, ...)<br />
Verwalten verschiedener Konfigurationen über den<br />
Android-Virtuell-Device-(AVD)-Manager<br />
Automatisches Kompilieren, Uploaden und Starten der Applikation auf dem<br />
Emulator aus Eclipse heraus<br />
6/34
DerEmulator<br />
Simulation der Applikation unter verschiedenen Android Versionen<br />
Testen der Applikation bei verschiedenen Auflösungen<br />
Konfiguration verschiedener Geräte-Typen (Motorrola, HTC, ...)<br />
Verwalten verschiedener Konfigurationen über den<br />
Android-Virtuell-Device-(AVD)-Manager<br />
Automatisches Kompilieren, Uploaden und Starten der Applikation auf dem<br />
Emulator aus Eclipse heraus<br />
6/34
DerEmulator<br />
Simulation der Applikation unter verschiedenen Android Versionen<br />
Testen der Applikation bei verschiedenen Auflösungen<br />
Konfiguration verschiedener Geräte-Typen (Motorrola, HTC, ...)<br />
Verwalten verschiedener Konfigurationen über den<br />
Android-Virtuell-Device-(AVD)-Manager<br />
Automatisches Kompilieren, Uploaden und Starten der Applikation auf dem<br />
Emulator aus Eclipse heraus<br />
6/34
Aufbaue<strong>in</strong>erApplikation<br />
Das Manifest<br />
Resourcen<br />
Aktivitäten und Layouts<br />
7/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Enthält grundlegende Informationen über e<strong>in</strong>e Applikation wie<br />
Name, Paketname und Version der Applikation<br />
Verwendete Komponenten (Aktivitäten, Services und Broadcast Receiver)<br />
Zugangsmöglichkeiten zu den e<strong>in</strong>zelnen Komponenten (Broadcasts, ...)<br />
Zugriffsrechte der Applikation (Internet, Anrufe, ...)<br />
Benötigte Zugriffsrechte anderer Applikationen zur Verwendung von Komponenten<br />
<strong>die</strong>ser Applikation<br />
M<strong>in</strong>imal und Maximal unterstützte API-Version<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er eXtended-Markup-Language(XML)-Datei<br />
8/34
Das Android Manifest<br />
Beispielstrukture<strong>in</strong>er Manifest-Datei<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
...<br />
<br />
<br />
<br />
...<br />
<br />
<br />
<br />
...<br />
<br />
<br />
<br />
<br />
9/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
Str<strong>in</strong>g Resourcen<br />
<br />
TaskIt<br />
Hello world!<br />
...<br />
<br />
10/34
Ressourcenverwaltung<br />
Trennung von Quellcode und Resourcen (Bildern, Zeichenketten, Layouts)<br />
Eröffnet Möglichkeit verschiedenste Geräte zu unterstützen<br />
Verwaltung der Resourcen <strong>in</strong> Verzeichnisstruktur unter res<br />
Feste Konventionen zur E<strong>in</strong>sortierung von Resourcen (Beispiel:<br />
res/values/str<strong>in</strong>gs.xml und res/values-de/str<strong>in</strong>gs.xml)<br />
Zugriff auf Resourcen aus dem Quellcode über automatisch generierte Klasse R<br />
Referenzierung der Resourcen über IDs (Beispiel: R.str<strong>in</strong>g.btnOk)<br />
Str<strong>in</strong>g Resourcen<br />
<br />
TaskIt<br />
Hello world!<br />
...<br />
<br />
FarbResourcen<br />
<br />
<br />
#ffffff<br />
#000000<br />
...<br />
<br />
10/34
Ressourcenverwaltung<br />
ZugriffaufResourcen<br />
public void onCreate(Bundle savedInstanceState) {<br />
// Call the parent method ...<br />
super.onCreate(savedInstanceState);<br />
// ... and set the content view.<br />
this.setContentView(R.layout.ma<strong>in</strong>);<br />
// Access the text view ...<br />
TextView mo<strong>in</strong> = (TextView) this.f<strong>in</strong>dViewById(R.id.helloTxt);<br />
// ... and change the label.<br />
mo<strong>in</strong>.setText(R.str<strong>in</strong>g.hello_world);<br />
}<br />
11/34
Komponenten<strong>in</strong>Android<br />
Activities<br />
Views und View-Groups<br />
Intents<br />
◮ Explizite Intents<br />
◮ Implizite Intents<br />
◮ Ergebnisse von Intents<br />
◮ Intent-Filter<br />
Services<br />
Content-Provider<br />
Broadcast-Receiver<br />
12/34
Aktivities<br />
Aktivitäten (Activities) bilden <strong>die</strong> Präsentationsschicht e<strong>in</strong>er Applikation<br />
E<strong>in</strong>e Applikation kann aus mehreren Aktivitäten (Dialoge oder Seiten) bestehen<br />
Zuweisung der grafischen Oberfläche mittels der Methode setContentView(View)<br />
Implementierung e<strong>in</strong>er Aktivität durch Ableitung e<strong>in</strong>er K<strong>in</strong>dklasse von Activity<br />
Wichtig: Überschreiben der Methode onCreate(Bundle)<br />
13/34
Aktivities<br />
Aktivitäten (Activities) bilden <strong>die</strong> Präsentationsschicht e<strong>in</strong>er Applikation<br />
E<strong>in</strong>e Applikation kann aus mehreren Aktivitäten (Dialoge oder Seiten) bestehen<br />
Zuweisung der grafischen Oberfläche mittels der Methode setContentView(View)<br />
Implementierung e<strong>in</strong>er Aktivität durch Ableitung e<strong>in</strong>er K<strong>in</strong>dklasse von Activity<br />
Wichtig: Überschreiben der Methode onCreate(Bundle)<br />
13/34
Aktivities<br />
Aktivitäten (Activities) bilden <strong>die</strong> Präsentationsschicht e<strong>in</strong>er Applikation<br />
E<strong>in</strong>e Applikation kann aus mehreren Aktivitäten (Dialoge oder Seiten) bestehen<br />
Zuweisung der grafischen Oberfläche mittels der Methode setContentView(View)<br />
Implementierung e<strong>in</strong>er Aktivität durch Ableitung e<strong>in</strong>er K<strong>in</strong>dklasse von Activity<br />
Wichtig: Überschreiben der Methode onCreate(Bundle)<br />
13/34
Aktivities<br />
Aktivitäten (Activities) bilden <strong>die</strong> Präsentationsschicht e<strong>in</strong>er Applikation<br />
E<strong>in</strong>e Applikation kann aus mehreren Aktivitäten (Dialoge oder Seiten) bestehen<br />
Zuweisung der grafischen Oberfläche mittels der Methode setContentView(View)<br />
Implementierung e<strong>in</strong>er Aktivität durch Ableitung e<strong>in</strong>er K<strong>in</strong>dklasse von Activity<br />
Wichtig: Überschreiben der Methode onCreate(Bundle)<br />
13/34
Aktivities<br />
Aktivitäten (Activities) bilden <strong>die</strong> Präsentationsschicht e<strong>in</strong>er Applikation<br />
E<strong>in</strong>e Applikation kann aus mehreren Aktivitäten (Dialoge oder Seiten) bestehen<br />
Zuweisung der grafischen Oberfläche mittels der Methode setContentView(View)<br />
Implementierung e<strong>in</strong>er Aktivität durch Ableitung e<strong>in</strong>er K<strong>in</strong>dklasse von Activity<br />
Wichtig: Überschreiben der Methode onCreate(Bundle)<br />
13/34
Aktivities<br />
Aktivitäten (Activities) bilden <strong>die</strong> Präsentationsschicht e<strong>in</strong>er Applikation<br />
E<strong>in</strong>e Applikation kann aus mehreren Aktivitäten (Dialoge oder Seiten) bestehen<br />
Zuweisung der grafischen Oberfläche mittels der Methode setContentView(View)<br />
Implementierung e<strong>in</strong>er Aktivität durch Ableitung e<strong>in</strong>er K<strong>in</strong>dklasse von Activity<br />
Wichtig: Überschreiben der Methode onCreate(Bundle)<br />
Basisimplementatione<strong>in</strong>er Aktivität<br />
public class TodoActivity extends Activity {<br />
protected void onCreate(Bundle savedInstanceState) {<br />
// Call the parent method ...<br />
super.onCreate(savedInstanceState);<br />
// ... and set the content view.<br />
this.setContentView(R.layout.ma<strong>in</strong>);<br />
}<br />
...<br />
}<br />
13/34
Aktivities<br />
Es gibt weitere Methoden wie beispielsweise onPause(), <strong>die</strong> vom System aufgerufen<br />
werden, um auf Status-Änderungen reagieren zu können. Man spricht <strong>in</strong> <strong>die</strong>sem<br />
Zusammenhang vom Activity Lifecycle.<br />
Runn<strong>in</strong>g Aktuell im Vordergrund bef<strong>in</strong>dliche Aktivität<br />
Paused Sichtbare, aber nicht mehr im Fokus bef<strong>in</strong>dliche Aktivitäten – Aktivität<br />
bleibt aktiv und der W<strong>in</strong>dowManager hat weiterh<strong>in</strong> Zugriff – Aktivität<br />
kann trotzdem bei Resourcenmangel vom System beendet werden<br />
Stopped Nicht sichtbare Aktivitäten – alle E<strong>in</strong>stellungen und Zustände<br />
gespeichert – werden dennoch häufig vom System beendet<br />
F<strong>in</strong>ished Vom System beendete Aktivitäten – müssen neu gestartet werden und<br />
<strong>die</strong> E<strong>in</strong>stellungen der letzten Sitzung neu geladen werden, falls sie<br />
erneut den Fokus bekommen<br />
14/34
Aktivities<br />
Es gibt weitere Methoden wie beispielsweise onPause(), <strong>die</strong> vom System aufgerufen<br />
werden, um auf Status-Änderungen reagieren zu können. Man spricht <strong>in</strong> <strong>die</strong>sem<br />
Zusammenhang vom Activity Lifecycle.<br />
Aus der Stack basierten Struktur des Systems ergeben sich folgende Zustände für<br />
e<strong>in</strong>e Aktivität:<br />
Runn<strong>in</strong>g Aktuell im Vordergrund bef<strong>in</strong>dliche Aktivität<br />
Paused Sichtbare, aber nicht mehr im Fokus bef<strong>in</strong>dliche Aktivitäten – Aktivität<br />
bleibt aktiv und der W<strong>in</strong>dowManager hat weiterh<strong>in</strong> Zugriff – Aktivität<br />
kann trotzdem bei Resourcenmangel vom System beendet werden<br />
Stopped Nicht sichtbare Aktivitäten – alle E<strong>in</strong>stellungen und Zustände<br />
gespeichert – werden dennoch häufig vom System beendet<br />
F<strong>in</strong>ished Vom System beendete Aktivitäten – müssen neu gestartet werden und<br />
<strong>die</strong> E<strong>in</strong>stellungen der letzten Sitzung neu geladen werden, falls sie<br />
erneut den Fokus bekommen<br />
14/34
Aktivities<br />
Es gibt weitere Methoden wie beispielsweise onPause(), <strong>die</strong> vom System aufgerufen<br />
werden, um auf Status-Änderungen reagieren zu können. Man spricht <strong>in</strong> <strong>die</strong>sem<br />
Zusammenhang vom Activity Lifecycle.<br />
Aus der Stack basierten Struktur des Systems ergeben sich folgende Zustände für<br />
e<strong>in</strong>e Aktivität:<br />
Runn<strong>in</strong>g Aktuell im Vordergrund bef<strong>in</strong>dliche Aktivität<br />
Paused Sichtbare, aber nicht mehr im Fokus bef<strong>in</strong>dliche Aktivitäten – Aktivität<br />
bleibt aktiv und der W<strong>in</strong>dowManager hat weiterh<strong>in</strong> Zugriff – Aktivität<br />
kann trotzdem bei Resourcenmangel vom System beendet werden<br />
Stopped Nicht sichtbare Aktivitäten – alle E<strong>in</strong>stellungen und Zustände<br />
gespeichert – werden dennoch häufig vom System beendet<br />
F<strong>in</strong>ished Vom System beendete Aktivitäten – müssen neu gestartet werden und<br />
<strong>die</strong> E<strong>in</strong>stellungen der letzten Sitzung neu geladen werden, falls sie<br />
erneut den Fokus bekommen<br />
14/34
Aktivities<br />
Es gibt weitere Methoden wie beispielsweise onPause(), <strong>die</strong> vom System aufgerufen<br />
werden, um auf Status-Änderungen reagieren zu können. Man spricht <strong>in</strong> <strong>die</strong>sem<br />
Zusammenhang vom Activity Lifecycle.<br />
Aus der Stack basierten Struktur des Systems ergeben sich folgende Zustände für<br />
e<strong>in</strong>e Aktivität:<br />
Runn<strong>in</strong>g Aktuell im Vordergrund bef<strong>in</strong>dliche Aktivität<br />
Paused Sichtbare, aber nicht mehr im Fokus bef<strong>in</strong>dliche Aktivitäten – Aktivität<br />
bleibt aktiv und der W<strong>in</strong>dowManager hat weiterh<strong>in</strong> Zugriff – Aktivität<br />
kann trotzdem bei Resourcenmangel vom System beendet werden<br />
Stopped Nicht sichtbare Aktivitäten – alle E<strong>in</strong>stellungen und Zustände<br />
gespeichert – werden dennoch häufig vom System beendet<br />
F<strong>in</strong>ished Vom System beendete Aktivitäten – müssen neu gestartet werden und<br />
<strong>die</strong> E<strong>in</strong>stellungen der letzten Sitzung neu geladen werden, falls sie<br />
erneut den Fokus bekommen<br />
14/34
Aktivities<br />
Es gibt weitere Methoden wie beispielsweise onPause(), <strong>die</strong> vom System aufgerufen<br />
werden, um auf Status-Änderungen reagieren zu können. Man spricht <strong>in</strong> <strong>die</strong>sem<br />
Zusammenhang vom Activity Lifecycle.<br />
Aus der Stack basierten Struktur des Systems ergeben sich folgende Zustände für<br />
e<strong>in</strong>e Aktivität:<br />
Runn<strong>in</strong>g Aktuell im Vordergrund bef<strong>in</strong>dliche Aktivität<br />
Paused Sichtbare, aber nicht mehr im Fokus bef<strong>in</strong>dliche Aktivitäten – Aktivität<br />
bleibt aktiv und der W<strong>in</strong>dowManager hat weiterh<strong>in</strong> Zugriff – Aktivität<br />
kann trotzdem bei Resourcenmangel vom System beendet werden<br />
Stopped Nicht sichtbare Aktivitäten – alle E<strong>in</strong>stellungen und Zustände<br />
gespeichert – werden dennoch häufig vom System beendet<br />
F<strong>in</strong>ished Vom System beendete Aktivitäten – müssen neu gestartet werden und<br />
<strong>die</strong> E<strong>in</strong>stellungen der letzten Sitzung neu geladen werden, falls sie<br />
erneut den Fokus bekommen<br />
14/34
Aktivities<br />
Es gibt weitere Methoden wie beispielsweise onPause(), <strong>die</strong> vom System aufgerufen<br />
werden, um auf Status-Änderungen reagieren zu können. Man spricht <strong>in</strong> <strong>die</strong>sem<br />
Zusammenhang vom Activity Lifecycle.<br />
Aus der Stack basierten Struktur des Systems ergeben sich folgende Zustände für<br />
e<strong>in</strong>e Aktivität:<br />
Runn<strong>in</strong>g Aktuell im Vordergrund bef<strong>in</strong>dliche Aktivität<br />
Paused Sichtbare, aber nicht mehr im Fokus bef<strong>in</strong>dliche Aktivitäten – Aktivität<br />
bleibt aktiv und der W<strong>in</strong>dowManager hat weiterh<strong>in</strong> Zugriff – Aktivität<br />
kann trotzdem bei Resourcenmangel vom System beendet werden<br />
Stopped Nicht sichtbare Aktivitäten – alle E<strong>in</strong>stellungen und Zustände<br />
gespeichert – werden dennoch häufig vom System beendet<br />
F<strong>in</strong>ished Vom System beendete Aktivitäten – müssen neu gestartet werden und<br />
<strong>die</strong> E<strong>in</strong>stellungen der letzten Sitzung neu geladen werden, falls sie<br />
erneut den Fokus bekommen<br />
14/34
Aktivities<br />
Abbildung: Der Aktivity Lifecycle (Quelle: http://developer.android.com)<br />
15/34
Viewsund View-Groups<br />
Teile von Benutzeroberflächen, wie beispielsweise Buttons, Auswahl- oder<br />
Texte<strong>in</strong>gabefelder<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
Aussehen und Verhalten von Views kann über ihre Attribute verändert werden<br />
ViewGroups (auch LayoutManager) <strong>die</strong>nen zur Strukturierung und Anordung von<br />
Views<br />
E<strong>in</strong>e beliebige Verschachtelung von ViewGroups ist möglich<br />
16/34
Viewsund View-Groups<br />
Teile von Benutzeroberflächen, wie beispielsweise Buttons, Auswahl- oder<br />
Texte<strong>in</strong>gabefelder<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
Aussehen und Verhalten von Views kann über ihre Attribute verändert werden<br />
ViewGroups (auch LayoutManager) <strong>die</strong>nen zur Strukturierung und Anordung von<br />
Views<br />
E<strong>in</strong>e beliebige Verschachtelung von ViewGroups ist möglich<br />
16/34
Viewsund View-Groups<br />
Teile von Benutzeroberflächen, wie beispielsweise Buttons, Auswahl- oder<br />
Texte<strong>in</strong>gabefelder<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
Aussehen und Verhalten von Views kann über ihre Attribute verändert werden<br />
ViewGroups (auch LayoutManager) <strong>die</strong>nen zur Strukturierung und Anordung von<br />
Views<br />
E<strong>in</strong>e beliebige Verschachtelung von ViewGroups ist möglich<br />
16/34
Viewsund View-Groups<br />
Teile von Benutzeroberflächen, wie beispielsweise Buttons, Auswahl- oder<br />
Texte<strong>in</strong>gabefelder<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
Aussehen und Verhalten von Views kann über ihre Attribute verändert werden<br />
ViewGroups (auch LayoutManager) <strong>die</strong>nen zur Strukturierung und Anordung von<br />
Views<br />
E<strong>in</strong>e beliebige Verschachtelung von ViewGroups ist möglich<br />
16/34
Viewsund View-Groups<br />
Teile von Benutzeroberflächen, wie beispielsweise Buttons, Auswahl- oder<br />
Texte<strong>in</strong>gabefelder<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
Aussehen und Verhalten von Views kann über ihre Attribute verändert werden<br />
ViewGroups (auch LayoutManager) <strong>die</strong>nen zur Strukturierung und Anordung von<br />
Views<br />
E<strong>in</strong>e beliebige Verschachtelung von ViewGroups ist möglich<br />
16/34
Viewsund View-Groups<br />
Teile von Benutzeroberflächen, wie beispielsweise Buttons, Auswahl- oder<br />
Texte<strong>in</strong>gabefelder<br />
Def<strong>in</strong>ition <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
Aussehen und Verhalten von Views kann über ihre Attribute verändert werden<br />
ViewGroups (auch LayoutManager) <strong>die</strong>nen zur Strukturierung und Anordung von<br />
Views<br />
E<strong>in</strong>e beliebige Verschachtelung von ViewGroups ist möglich<br />
E<strong>in</strong>e<strong>in</strong>faches Layout<br />
<br />
<br />
<br />
<br />
16/34
Viewsund View-Groups<br />
Zugriff auf Views und ViewGroups aus dem Quellcode heraus über f<strong>in</strong>dViewById()<br />
Laden e<strong>in</strong>es Layouts ohne Verwendung von setContentView() mit LayoutInflater<br />
17/34
Viewsund View-Groups<br />
Zugriff auf Views und ViewGroups aus dem Quellcode heraus über f<strong>in</strong>dViewById()<br />
Laden e<strong>in</strong>es Layouts ohne Verwendung von setContentView() mit LayoutInflater<br />
17/34
Viewsund View-Groups<br />
Zugriff auf Views und ViewGroups aus dem Quellcode heraus über f<strong>in</strong>dViewById()<br />
Laden e<strong>in</strong>es Layouts ohne Verwendung von setContentView() mit LayoutInflater<br />
ZugriffaufdasLayout<br />
// Fetch the layout <strong>in</strong>flater ...<br />
this.<strong>in</strong>flater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<br />
// ... and <strong>in</strong>flate the layout.<br />
View ma<strong>in</strong> = this.<strong>in</strong>flater.<strong>in</strong>flate(R.layout.row_layout, null);<br />
// Load the ImageView and assign the icon.<br />
ImageView icon = (ImageView) ma<strong>in</strong>.f<strong>in</strong>dViewById(R.id.icon);<br />
icon.setImageResource(R.drawable.my_icon);<br />
// Load the TextView and assign the content.<br />
TextView subject = (TextView) ma<strong>in</strong>.f<strong>in</strong>dViewById(R.id.subject);<br />
subject.setText("Hello Bob");<br />
17/34
Intents<br />
Nachrichten zur Kommunikation <strong>in</strong>nerhalb des Systems<br />
Aufruf von Funktionalitäten des Systems<br />
Übertragung von Daten zwischen verschiedenen Komponenten<br />
Methoden startActivity und startService, sowie sendBroadcast nutzen Intents<br />
Unterscheidung zwischen expliziten und impliziten Intents<br />
18/34
Intents<br />
Nachrichten zur Kommunikation <strong>in</strong>nerhalb des Systems<br />
Aufruf von Funktionalitäten des Systems<br />
Übertragung von Daten zwischen verschiedenen Komponenten<br />
Methoden startActivity und startService, sowie sendBroadcast nutzen Intents<br />
Unterscheidung zwischen expliziten und impliziten Intents<br />
18/34
Intents<br />
Nachrichten zur Kommunikation <strong>in</strong>nerhalb des Systems<br />
Aufruf von Funktionalitäten des Systems<br />
Übertragung von Daten zwischen verschiedenen Komponenten<br />
Methoden startActivity und startService, sowie sendBroadcast nutzen Intents<br />
Unterscheidung zwischen expliziten und impliziten Intents<br />
18/34
Intents<br />
Nachrichten zur Kommunikation <strong>in</strong>nerhalb des Systems<br />
Aufruf von Funktionalitäten des Systems<br />
Übertragung von Daten zwischen verschiedenen Komponenten<br />
Methoden startActivity und startService, sowie sendBroadcast nutzen Intents<br />
Unterscheidung zwischen expliziten und impliziten Intents<br />
18/34
Intents<br />
Nachrichten zur Kommunikation <strong>in</strong>nerhalb des Systems<br />
Aufruf von Funktionalitäten des Systems<br />
Übertragung von Daten zwischen verschiedenen Komponenten<br />
Methoden startActivity und startService, sowie sendBroadcast nutzen Intents<br />
Unterscheidung zwischen expliziten und impliziten Intents<br />
18/34
ExpliziteIntents<br />
Der Empfänger der Nachricht wird explizit angegeben.<br />
19/34
ExpliziteIntents<br />
Der Empfänger der Nachricht wird explizit angegeben.<br />
Startene<strong>in</strong>er Aktivität<br />
Intent i = new Intent(this, TodoActivity.class);<br />
i.putExtra(TodoActivity.TODO_ID, 13);<br />
startActivity(i);<br />
19/34
ExpliziteIntents<br />
Der Empfänger der Nachricht wird explizit angegeben.<br />
Startene<strong>in</strong>er Aktivität<br />
Intent i = new Intent(this, TodoActivity.class);<br />
i.putExtra(TodoActivity.TODO_ID, 13);<br />
startActivity(i);<br />
Die so übertragenden Daten können <strong>in</strong> der onCreate() Methode extrahiert und<br />
verarbeitet werden.<br />
19/34
ExpliziteIntents<br />
Der Empfänger der Nachricht wird explizit angegeben.<br />
Startene<strong>in</strong>er Aktivität<br />
Intent i = new Intent(this, TodoActivity.class);<br />
i.putExtra(TodoActivity.TODO_ID, 13);<br />
startActivity(i);<br />
Die so übertragenden Daten können <strong>in</strong> der onCreate() Methode extrahiert und<br />
verarbeitet werden.<br />
Extrahierender Daten<br />
protected void onCreate(Bundle savedInstanceState) {<br />
// Fetch the <strong>in</strong>tent bundle, ...<br />
Bundle bundle = this.getIntent().getExtras();<br />
// ... <strong>in</strong>itialize the todo id ...<br />
long todoId = Todo.PLACEHOLDER_ID;<br />
// ... and try to fetch it.<br />
if(bundle != null) {<br />
todoId = bundle.getLong(TodoActivity.TODO_ID, Todo.PLACEHOLDER_ID);<br />
}<br />
}<br />
19/34
ImpliziteIntents<br />
Anders als bei expliziten Intents, wird bei der Verwendung impliziter Intents nicht<br />
spezifiziert welche Komponente verwendet werden soll.<br />
System kann dir richtige Komponente für <strong>die</strong> gegebene Aktion auswählen<br />
Man kann dem Benutzer <strong>die</strong> Möglichkeit geben e<strong>in</strong>e andere Applikation zu nutzen<br />
Es kann auf andere Applikationen zurückgegriffen werden ohne <strong>die</strong> benötigte<br />
Funktionalität selbst zu implementieren<br />
20/34
ImpliziteIntents<br />
Anders als bei expliziten Intents, wird bei der Verwendung impliziter Intents nicht<br />
spezifiziert welche Komponente verwendet werden soll.<br />
AuswahlderKomponente<br />
Intent smsIntent = new Intent(Intent.ACTION_VIEW);<br />
smsIntent.setType("vnd.android-dir/mms-sms");<br />
smsIntent.putExtra("sms_body", "Hello there! This is one way to send an sms.");<br />
startActivity(Intent.createChooser(smsIntent, "Send an SMS");<br />
System kann dir richtige Komponente für <strong>die</strong> gegebene Aktion auswählen<br />
Man kann dem Benutzer <strong>die</strong> Möglichkeit geben e<strong>in</strong>e andere Applikation zu nutzen<br />
Es kann auf andere Applikationen zurückgegriffen werden ohne <strong>die</strong> benötigte<br />
Funktionalität selbst zu implementieren<br />
20/34
ImpliziteIntents<br />
Anders als bei expliziten Intents, wird bei der Verwendung impliziter Intents nicht<br />
spezifiziert welche Komponente verwendet werden soll.<br />
AuswahlderKomponente<br />
Intent smsIntent = new Intent(Intent.ACTION_VIEW);<br />
smsIntent.setType("vnd.android-dir/mms-sms");<br />
smsIntent.putExtra("sms_body", "Hello there! This is one way to send an sms.");<br />
startActivity(Intent.createChooser(smsIntent, "Send an SMS");<br />
System kann dir richtige Komponente für <strong>die</strong> gegebene Aktion auswählen<br />
Man kann dem Benutzer <strong>die</strong> Möglichkeit geben e<strong>in</strong>e andere Applikation zu nutzen<br />
Es kann auf andere Applikationen zurückgegriffen werden ohne <strong>die</strong> benötigte<br />
Funktionalität selbst zu implementieren<br />
20/34
ImpliziteIntents<br />
Anders als bei expliziten Intents, wird bei der Verwendung impliziter Intents nicht<br />
spezifiziert welche Komponente verwendet werden soll.<br />
AuswahlderKomponente<br />
Intent smsIntent = new Intent(Intent.ACTION_VIEW);<br />
smsIntent.setType("vnd.android-dir/mms-sms");<br />
smsIntent.putExtra("sms_body", "Hello there! This is one way to send an sms.");<br />
startActivity(Intent.createChooser(smsIntent, "Send an SMS");<br />
System kann dir richtige Komponente für <strong>die</strong> gegebene Aktion auswählen<br />
Man kann dem Benutzer <strong>die</strong> Möglichkeit geben e<strong>in</strong>e andere Applikation zu nutzen<br />
Es kann auf andere Applikationen zurückgegriffen werden ohne <strong>die</strong> benötigte<br />
Funktionalität selbst zu implementieren<br />
20/34
ImpliziteIntents<br />
Anders als bei expliziten Intents, wird bei der Verwendung impliziter Intents nicht<br />
spezifiziert welche Komponente verwendet werden soll.<br />
AuswahlderKomponente<br />
Intent smsIntent = new Intent(Intent.ACTION_VIEW);<br />
smsIntent.setType("vnd.android-dir/mms-sms");<br />
smsIntent.putExtra("sms_body", "Hello there! This is one way to send an sms.");<br />
startActivity(Intent.createChooser(smsIntent, "Send an SMS");<br />
System kann dir richtige Komponente für <strong>die</strong> gegebene Aktion auswählen<br />
Man kann dem Benutzer <strong>die</strong> Möglichkeit geben e<strong>in</strong>e andere Applikation zu nutzen<br />
Es kann auf andere Applikationen zurückgegriffen werden ohne <strong>die</strong> benötigte<br />
Funktionalität selbst zu implementieren<br />
20/34
Ergebnissevon Intents<br />
21/34
Ergebnissevon Intents<br />
Startender Aktivität<br />
public class TodoList extends ListActivity {<br />
...<br />
@Override<br />
protected void onListItemClick(ListView l, View v, <strong>in</strong>t position, long id) {<br />
Intent i = new Intent(this, TodoActivity.class);<br />
i.putExtra(TodoActivity.TODO_ID, todo.getId());<br />
i.putExtra(TodoActivity.TODO_ACTION, TodoActivity.TODO_VIEW);<br />
startActivityForResult(i, TODO_VIEW_REQUEST);<br />
}<br />
}<br />
21/34
Ergebnissevon Intents<br />
Startender Aktivität<br />
public class TodoList extends ListActivity {<br />
...<br />
@Override<br />
protected void onListItemClick(ListView l, View v, <strong>in</strong>t position, long id) {<br />
Intent i = new Intent(this, TodoActivity.class);<br />
i.putExtra(TodoActivity.TODO_ID, todo.getId());<br />
i.putExtra(TodoActivity.TODO_ACTION, TodoActivity.TODO_VIEW);<br />
startActivityForResult(i, TODO_VIEW_REQUEST);<br />
}<br />
}<br />
Ergebnissesenden<br />
public class TodoActivity extends Activity {<br />
...<br />
@Override<br />
public void f<strong>in</strong>ish() {<br />
Intent result = new Intent();<br />
result.putExtra(TodoActivity.TODO_ID, todo.getId());<br />
setResult(RESULT_OK, result);<br />
super.f<strong>in</strong>ish();<br />
}<br />
}<br />
21/34
Ergebnissevon Intents<br />
Ergebnisseempfangen<br />
public class TodoList extends ListActivity {<br />
...<br />
@Override<br />
protected void onActivityResult(<strong>in</strong>t requestCode, <strong>in</strong>t resultCode, Intent data) {<br />
if (resultCode == RESULT_OK && requestCode == TODO_VIEW_REQUEST) {<br />
// Fetch the selected result.<br />
long id = data.getLong(TodoActivity.TODO_ID, Todo.PLACEHOLDER_ID);<br />
}<br />
}<br />
}<br />
22/34
Intent-Filter<br />
Legen fest auf welche impliziten Intents e<strong>in</strong>e Komponente anspricht<br />
Explizite Intents s<strong>in</strong>d nicht von <strong>die</strong>sen Filtern betroffen<br />
Ermöglicht Reaktion auf System-Events (ankommende SMS, Systemstart, ...)<br />
23/34
Intent-Filter<br />
Legen fest auf welche impliziten Intents e<strong>in</strong>e Komponente anspricht<br />
Explizite Intents s<strong>in</strong>d nicht von <strong>die</strong>sen Filtern betroffen<br />
Ermöglicht Reaktion auf System-Events (ankommende SMS, Systemstart, ...)<br />
23/34
Intent-Filter<br />
Legen fest auf welche impliziten Intents e<strong>in</strong>e Komponente anspricht<br />
Explizite Intents s<strong>in</strong>d nicht von <strong>die</strong>sen Filtern betroffen<br />
Ermöglicht Reaktion auf System-Events (ankommende SMS, Systemstart, ...)<br />
23/34
Intent-Filter<br />
Legen fest auf welche impliziten Intents e<strong>in</strong>e Komponente anspricht<br />
Explizite Intents s<strong>in</strong>d nicht von <strong>die</strong>sen Filtern betroffen<br />
Ermöglicht Reaktion auf System-Events (ankommende SMS, Systemstart, ...)<br />
DeklarationimManifest<br />
<br />
<br />
...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
...<br />
<br />
<br />
23/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
Im H<strong>in</strong>tergrund arbeitende Komponenten für länger andauernde Operationen<br />
Bietet ke<strong>in</strong>e eigene Oberfläche<br />
Läuft im selben Thread wie <strong>die</strong> Applikation<br />
Können von e<strong>in</strong>er anderen Komponente, Applikation oder durch e<strong>in</strong> Event<br />
(BroadcastReceiver) gestartet werden<br />
Kann an e<strong>in</strong>e andere Komponente gebunden werden um mit ihr zu <strong>in</strong>teragieren<br />
E<strong>in</strong> Service kann zwei Zustände annehmen:<br />
Gestartet (Aufruf mit startService())<br />
Beendet sich am Schluss selbst ohne e<strong>in</strong> Ergebnis zu liefern<br />
Kann praktisch unendlich laufen, auch wenn <strong>die</strong> startende<br />
Komponente beendet wurde<br />
Gebunden (Aufruf mit b<strong>in</strong>dService())<br />
Service wurde von anderen Komponente mit b<strong>in</strong>dService() an sich<br />
gebunden<br />
Interaktion (Nachrichten, Ergebnisse und Anfragen) mit startender<br />
Komponente möglich<br />
B<strong>in</strong>dung an beliebig viele Komponenten möglich<br />
Falls alle verbundenen Komponenten beendet oder getrennt<br />
werden, wird der Service beendet<br />
24/34
Services<br />
E<strong>in</strong>e<strong>in</strong>facher Service<br />
public class TheService extends Service {<br />
MediaPlayer player;<br />
@Override<br />
public IB<strong>in</strong>der onB<strong>in</strong>d(Intent <strong>in</strong>tent) {<br />
return null; // No b<strong>in</strong>d<strong>in</strong>g needed.<br />
}<br />
@Override<br />
public void onCreate() {<br />
Toast.makeText(this, "The Service started", Toast.LENGTH_LONG).show();<br />
player = MediaPlayer.create(this, R.raw.bra<strong>in</strong>candy);<br />
player.setLoop<strong>in</strong>g(false); // Set loop<strong>in</strong>g<br />
}<br />
@Override<br />
public void onDestroy() {<br />
Toast.makeText(this, "The Service stopped", Toast.LENGTH_LONG).show();<br />
player.stop();<br />
}<br />
@Override<br />
public void onStart(Intent <strong>in</strong>tent, <strong>in</strong>t startid) {<br />
Toast.makeText(this, "The Service started", Toast.LENGTH_LONG).show();<br />
player.start();<br />
}<br />
}<br />
25/34
Content-Provider<br />
Verwalten den Zugriff auf strukturierte Daten<br />
Kapseln <strong>die</strong> Daten und bieten Mechanismen zum Datenschutz<br />
ContentResolver ermöglichen <strong>die</strong> Kommunikation mit e<strong>in</strong>em ContentProvider als<br />
Client<br />
ContentProvider werden beötigt, wenn Daten zwischen Applikationen kopiert<br />
werden sollen oder angepasste Suchergebnisse benötigt werden<br />
Es existieren Android eigene ContentProvider für Audio, Video, Bilder und<br />
Kontakte<br />
26/34
Content-Provider<br />
Verwalten den Zugriff auf strukturierte Daten<br />
Kapseln <strong>die</strong> Daten und bieten Mechanismen zum Datenschutz<br />
ContentResolver ermöglichen <strong>die</strong> Kommunikation mit e<strong>in</strong>em ContentProvider als<br />
Client<br />
ContentProvider werden beötigt, wenn Daten zwischen Applikationen kopiert<br />
werden sollen oder angepasste Suchergebnisse benötigt werden<br />
Es existieren Android eigene ContentProvider für Audio, Video, Bilder und<br />
Kontakte<br />
26/34
Content-Provider<br />
Verwalten den Zugriff auf strukturierte Daten<br />
Kapseln <strong>die</strong> Daten und bieten Mechanismen zum Datenschutz<br />
ContentResolver ermöglichen <strong>die</strong> Kommunikation mit e<strong>in</strong>em ContentProvider als<br />
Client<br />
ContentProvider werden beötigt, wenn Daten zwischen Applikationen kopiert<br />
werden sollen oder angepasste Suchergebnisse benötigt werden<br />
Es existieren Android eigene ContentProvider für Audio, Video, Bilder und<br />
Kontakte<br />
26/34
Content-Provider<br />
Verwalten den Zugriff auf strukturierte Daten<br />
Kapseln <strong>die</strong> Daten und bieten Mechanismen zum Datenschutz<br />
ContentResolver ermöglichen <strong>die</strong> Kommunikation mit e<strong>in</strong>em ContentProvider als<br />
Client<br />
ContentProvider werden beötigt, wenn Daten zwischen Applikationen kopiert<br />
werden sollen oder angepasste Suchergebnisse benötigt werden<br />
Es existieren Android eigene ContentProvider für Audio, Video, Bilder und<br />
Kontakte<br />
26/34
Content-Provider<br />
Verwalten den Zugriff auf strukturierte Daten<br />
Kapseln <strong>die</strong> Daten und bieten Mechanismen zum Datenschutz<br />
ContentResolver ermöglichen <strong>die</strong> Kommunikation mit e<strong>in</strong>em ContentProvider als<br />
Client<br />
ContentProvider werden beötigt, wenn Daten zwischen Applikationen kopiert<br />
werden sollen oder angepasste Suchergebnisse benötigt werden<br />
Es existieren Android eigene ContentProvider für Audio, Video, Bilder und<br />
Kontakte<br />
26/34
Broadcast-Receiver<br />
Empfänger von Intents <strong>die</strong> mit sendBroadcast() versendet wurden<br />
Kommunikation zwischen verschiedenen Komponenten<br />
Reagieren auf System-Events<br />
27/34
Broadcast-Receiver<br />
Empfänger von Intents <strong>die</strong> mit sendBroadcast() versendet wurden<br />
Kommunikation zwischen verschiedenen Komponenten<br />
Reagieren auf System-Events<br />
27/34
Broadcast-Receiver<br />
Empfänger von Intents <strong>die</strong> mit sendBroadcast() versendet wurden<br />
Kommunikation zwischen verschiedenen Komponenten<br />
Reagieren auf System-Events<br />
27/34
Broadcast-Receiver<br />
Empfänger von Intents <strong>die</strong> mit sendBroadcast() versendet wurden<br />
Kommunikation zwischen verschiedenen Komponenten<br />
Reagieren auf System-Events<br />
DeklarationimManifest<br />
<br />
<br />
<br />
<br />
<br />
27/34
Broadcast-Receiver<br />
Empfänger von Intents <strong>die</strong> mit sendBroadcast() versendet wurden<br />
Kommunikation zwischen verschiedenen Komponenten<br />
Reagieren auf System-Events<br />
DeklarationimManifest<br />
<br />
<br />
<br />
<br />
<br />
Implementierung<br />
public class SmsObserver extends BroadcastReceiver {<br />
private Handler handler = new Handler();<br />
@Override<br />
public void onReceive(Context context, Intent <strong>in</strong>tent) {<br />
// Defer the process<strong>in</strong>g a little bit.<br />
handler.postDelayed(new SmsReader(context, <strong>in</strong>tent), 500);<br />
}<br />
}<br />
27/34
Widgets<br />
Das Widget Layout<br />
Die AppWidgetProviderInfo<br />
Der AppWidgetProvider<br />
28/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
Abbildung: Das E<strong>in</strong>stellungs-Widget<br />
29/34
Widgets<br />
M<strong>in</strong>iaturansicht, <strong>die</strong> <strong>in</strong> andere Applikationen, wie den Desktop <strong>in</strong>tegriert werden<br />
können<br />
Widgets werden periodisch aktualisiert<br />
Besteht aus folgenden Komponenten:<br />
AppWidgetProviderInfo XML-Datei, <strong>die</strong> für das System wichtige Informationen<br />
enthält<br />
AppWidgetProvider Implementiert <strong>die</strong> grundlegenden Methoden um mit dem<br />
Widget zu <strong>in</strong>teragieren. Interaktion basiert auf Broadcasts.<br />
WidgetView Def<strong>in</strong>iert das zu Anfang sichtbare Layout (XML-Datei)<br />
Abbildung: Das E<strong>in</strong>stellungs-Widget<br />
Optional kann auch e<strong>in</strong>e gesonderte Aktivität zur Konfiguration des Widget h<strong>in</strong>terlegt<br />
werden.<br />
29/34
WidgetLayout<br />
Deklaration des Layouts <strong>in</strong> Form von XML<br />
Layouts werden <strong>in</strong> res/layouts/ gespeichert<br />
Nicht alle Views und ViewGroups können verwendet werden (NumberPicker)<br />
30/34
WidgetLayout<br />
Deklaration des Layouts <strong>in</strong> Form von XML<br />
Layouts werden <strong>in</strong> res/layouts/ gespeichert<br />
Nicht alle Views und ViewGroups können verwendet werden (NumberPicker)<br />
30/34
WidgetLayout<br />
Deklaration des Layouts <strong>in</strong> Form von XML<br />
Layouts werden <strong>in</strong> res/layouts/ gespeichert<br />
Nicht alle Views und ViewGroups können verwendet werden (NumberPicker)<br />
30/34
WidgetLayout<br />
Deklaration des Layouts <strong>in</strong> Form von XML<br />
Layouts werden <strong>in</strong> res/layouts/ gespeichert<br />
Nicht alle Views und ViewGroups können verwendet werden (NumberPicker)<br />
DasWidgetLayout<br />
<br />
<br />
<br />
30/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
Die Attribute des appwidget-provider Elements:<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
Die Attribute des appwidget-provider Elements:<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
Die Attribute des appwidget-provider Elements:<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
Die Attribute des appwidget-provider Elements:<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
Die Attribute des appwidget-provider Elements:<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DieAppWidgetProviderInfo<br />
Def<strong>in</strong>iert alle essentiellen Rahmenbed<strong>in</strong>gungen e<strong>in</strong>es Widgets (<strong>in</strong>itiales Layout,<br />
Bemaßungen, Dauer bis zur Aktualisierung)<br />
Deklaration <strong>in</strong> Form e<strong>in</strong>er XML-Datei<br />
DieWidgetInfo<br />
<br />
Die Attribute des appwidget-provider Elements:<br />
m<strong>in</strong>Width M<strong>in</strong>imale Breite des Widgets <strong>in</strong> dip<br />
m<strong>in</strong>Height M<strong>in</strong>imale Höhe des Widgets <strong>in</strong> dip<br />
updatePeriodMillis Dauer bis zur nächsten Aktualisierung des Widgets <strong>in</strong><br />
Millisekunden<br />
<strong>in</strong>itialLayout Das <strong>in</strong>itiale Layout<br />
resizeMode Def<strong>in</strong>iert, wie <strong>die</strong> Bemaßungen durch den Benutzer angepasst werden<br />
können<br />
31/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
AppWidgetProvider ist von BroadcastReceiver abgeleitet<br />
Reagiert auf verschiedene Events und ruft entsprechende Methoden auf<br />
(FrontController Pattern)<br />
Broadcast werden ausgelöst, wenn e<strong>in</strong> Widget aktualisiert, gelöscht, aktiviert oder<br />
deaktiviert wird<br />
Folgenden Methoden verarbeiten <strong>die</strong> Events:<br />
onUpdate() Methode wird <strong>in</strong> regelmäßigen Abständen (updatePeriodMillis)<br />
aufgerufen – kümmert sich um <strong>die</strong> Aktualisierung des Widgets –<br />
sollte e<strong>in</strong> Konfigurationsdialog implementiert se<strong>in</strong>, muss <strong>die</strong>ser<br />
sich um den ersten Aufruf kümmern<br />
onDelete() Wird jedesmal aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs gelöscht<br />
wird.<br />
onEnabled() Wird dann aufgerufen wenn e<strong>in</strong> Widget <strong>die</strong>ses Typs erzeugt wird<br />
(Ke<strong>in</strong> zweites mal).<br />
onDisabled() Wird aufgerufen wenn das letzte Widget <strong>die</strong>ses Typs gelöscht wird<br />
(Bere<strong>in</strong>igung temporärer Daten)<br />
onReceive() Methode wird immer ausgeführt, wenn e<strong>in</strong> Broadcast empfangen<br />
wird (muss zumeist nicht implementiert werden)<br />
32/34
DerAppWidgetProvider<br />
Der AppWidgetProvider<br />
public class HelloWidgetProvider extends AppWidgetProvider {<br />
public void onUpdate(Context context, AppWidgetManager appWidgetManager, <strong>in</strong>t[] appWidgetIds) {<br />
f<strong>in</strong>al <strong>in</strong>t numWidgets = appWidgetIds.length;<br />
f<strong>in</strong>al Str<strong>in</strong>g[] helloStack = {<br />
"Hello", "Hi", "Shalom", "Ahlan", "Marhaba",<br />
"Terve", "Bula", "Aloha", "Salut", "Ciao",<br />
"Ave", "Hoi", "Morn", "Tschau", "Namaste"};<br />
// Loop over all <strong>in</strong>stances of this widget.<br />
for (<strong>in</strong>t i = 0; i < numWidgets; i++) {<br />
// Fetch the ListView, ...<br />
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);<br />
// ... calculate stack position ...<br />
<strong>in</strong>t rand = (<strong>in</strong>t) (Math.random()*15);<br />
// ... and set the hello view.<br />
views.setTextViewText(R.id.hello, this.helloStack[rand]);<br />
// Perform an update on the current app widget.<br />
appWidgetManager.updateAppWidget(appWidgetIds[i], views);<br />
}<br />
}<br />
}<br />
33/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34
Android 4<br />
Vere<strong>in</strong>heitlichtes GUI-Framework für Smartphones, Tablets und andere Endgeräte<br />
E<strong>in</strong>facher Zugriff auf Kontakte, Profildaten, Kalender E<strong>in</strong>träge und soziale<br />
Netzwerke<br />
Verbesserte Multimedia API (Neue Codecs, erweitertes Stream<strong>in</strong>g, ...)<br />
Neue Komponenten für <strong>die</strong> Erstellung von Benutzeroberflächen (NumberPicker,<br />
...)<br />
Verbesserung der Hardware-Anforderungen (Hardware beschleunigte<br />
2D-Darstellung)<br />
Erweiterung von Widgets (ViewGroups werden nun Unterstützt)<br />
Neue VPN-API<br />
34/34