|
Vorwort |
6 |
|
|
Inhaltsverzeichnis |
10 |
|
|
1 Ein erstes Beispiel |
20 |
|
|
1.1 Projekt anlegen |
20 |
|
|
1.2 Die erste Activity |
22 |
|
|
1.3 Layout definieren |
23 |
|
|
1.4 Activities aufrufen |
26 |
|
|
1.5 Das Android-Manifest |
28 |
|
|
1.6 Fazit |
34 |
|
|
2 Systemaufbau |
36 |
|
|
2.1 Architekturübersicht |
36 |
|
|
2.2 Die Dalvik Virtual Machine |
38 |
|
|
2.3 Standardbibliotheken |
40 |
|
|
2.4 Der Anwendungsrahmen |
41 |
|
|
2.5 Android-Komponenten |
41 |
|
|
2.6 Die Klasse Context |
43 |
|
|
3 Sicherheit |
44 |
|
|
3.1 Das Sandbox-Prinzip |
44 |
|
|
3.2 Signieren von Anwendungen |
45 |
|
|
3.3 Berechtigungen |
46 |
|
|
3.4 Anwendungsübergreifende Berechtigungen |
48 |
|
|
4 Beispielanwendung Amando |
52 |
|
|
4.1 Aus Sicht des Anwenders |
52 |
|
|
4.2 Kapitelübersicht |
55 |
|
|
5 Oberflächengestaltung |
56 |
|
|
5.1 Ziel |
56 |
|
|
5.2 Schnelleinstieg: Activities, Layouts und Views |
56 |
|
|
5.2.1 Grundbausteine der Oberflächengestaltung |
57 |
|
|
5.2.2 Oberflächen implementieren |
58 |
|
|
5.3 Ressourcen |
61 |
|
|
5.3.1 Definition von Ressourcen |
61 |
|
|
5.3.2 Zugriff auf Ressourcen |
64 |
|
|
5.3.3 Textressourcen |
67 |
|
|
5.3.4 Farbressourcen |
68 |
|
|
5.3.5 Größendefinitionen |
69 |
|
|
5.3.6 Bilder |
69 |
|
|
5.3.7 Animationen |
71 |
|
|
5.3.8 Multimediadateien |
72 |
|
|
5.3.9 Der raw-Ordner |
73 |
|
|
5.3.10 XML-Dateien |
74 |
|
|
5.3.11 Der Asset-Ordner |
74 |
|
|
5.4 Layouts und Views |
75 |
|
|
5.4.1 Definition von Layouts |
75 |
|
|
5.4.2 Übersicht vorhandener Layouts |
78 |
|
|
5.4.3 Übersicht vorhandener Views |
82 |
|
|
5.4.4 Views verwenden |
83 |
|
|
5.5 Schaltflächen und Menüs |
85 |
|
|
5.5.1 Schaltflächen |
86 |
|
|
5.5.2 Oberflächenereignisse |
87 |
|
|
5.5.3 Menüs im Allgemeinen |
88 |
|
|
5.5.4 Menüdefinition |
89 |
|
|
5.5.5 Optionsmenüs |
91 |
|
|
5.5.6 Kontextmenüs |
92 |
|
|
5.5.7 Dynamische Menügestaltung |
94 |
|
|
5.6 Formularverarbeitung |
96 |
|
|
5.6.1 Zielsetzung |
96 |
|
|
5.6.2 Arbeiten mit Views |
97 |
|
|
5.7 Das Android-Manifest |
101 |
|
|
5.8 Formatvorlagen: Styles und Themes |
103 |
|
|
5.8.1 Styles |
103 |
|
|
5.8.2 Themes |
105 |
|
|
5.9 Implementierung einer Bildschirmseite |
107 |
|
|
5.9.1 Checkliste: Bildschirmseite implementieren |
107 |
|
|
5.9.2 Texte für Bildschirmseiten definieren |
108 |
|
|
5.9.3 Styles und Themes definieren |
110 |
|
|
5.9.4 Weitere Ressourcen definieren |
110 |
|
|
5.9.5 Layouts definieren |
110 |
|
|
5.9.6 Menüs definieren |
112 |
|
|
5.9.7 Activity implementieren |
112 |
|
|
5.9.8 Android-Manifest anpassen |
114 |
|
|
5.9.9 Bildschirmseite im Emulator testen |
115 |
|
|
5.10 Tipps und Tricks |
117 |
|
|
5.10.1 Scrolling |
117 |
|
|
5.10.2 Umgebungsabhängige Ressourcen |
119 |
|
|
5.10.3 Hilfeseiten mit WebView darstellen |
121 |
|
|
5.10.4 Der Hierarchy Viewer |
125 |
|
|
5.11 Fazit |
127 |
|
|
6 Oberflächen und Daten |
128 |
|
|
6.1 Zielsetzung |
128 |
|
|
6.2 AdapterViews und Ressourcen |
129 |
|
|
6.3 AdapterViews und Adapter |
130 |
|
|
6.3.1 ArrayAdapter |
131 |
|
|
6.3.2 SimpleCursorAdapter |
133 |
|
|
6.3.3 Auf Ereignisse reagieren |
134 |
|
|
6.4 Performante Listen |
137 |
|
|
6.5 Anwendungseinstellungen |
140 |
|
|
6.5.1 Begriffsdefinitionen |
141 |
|
|
6.5.2 Einstellungen definieren |
141 |
|
|
6.5.3 Einstellungsseite implementieren |
144 |
|
|
6.5.4 Auf Einstellungen zugreifen |
146 |
|
|
6.5.5 Einstellungen bearbeiten |
147 |
|
|
6.6 Fortschrittsanzeige |
148 |
|
|
6.7 Fazit |
149 |
|
|
7 Intents |
152 |
|
|
7.1 Warum gibt es Intents? |
152 |
|
|
7.2 Explizite Intents |
153 |
|
|
7.3 Implizite Intents |
154 |
|
|
7.3.1 Intent-Filter für implizite Intents |
154 |
|
|
7.3.2 Ein einfaches Beispiel |
157 |
|
|
7.3.3 Intent-Resolution |
159 |
|
|
7.3.4 Beispiele für implizite Intents |
159 |
|
|
7.3.5 Fehlerbehandlung |
166 |
|
|
7.4 Sub-Activities |
167 |
|
|
7.4.1 Sub-Activities aufrufen |
167 |
|
|
7.4.2 Sub-Activities verwenden |
168 |
|
|
7.5 Anruf einleiten |
172 |
|
|
7.6 Fazit |
173 |
|
|
8 Hintergrundoperationen |
176 |
|
|
8.1 Ziel |
176 |
|
|
8.2 Theorie: Prozesse, Threads, Services |
177 |
|
|
8.2.1 Allgemeines |
177 |
|
|
8.2.2 UI-Thread |
177 |
|
|
8.2.3 ANR |
178 |
|
|
8.2.4 Prozesse vs. Threads |
179 |
|
|
8.2.5 Services |
180 |
|
|
8.2.6 Services vs. Threads |
181 |
|
|
8.2.7 Binder |
182 |
|
|
8.3 Implementierung eines Local Service |
185 |
|
|
8.3.1 Local Service |
185 |
|
|
8.3.2 Mit einem Service verbinden |
186 |
|
|
8.3.3 Services starten und stoppen |
189 |
|
|
8.4 Tipps und Tricks |
190 |
|
|
8.5 Callback-Mechanismen |
191 |
|
|
8.5.1 Handler |
192 |
|
|
8.5.2 Implementierung |
194 |
|
|
8.5.3 Threads mit Schleifen |
199 |
|
|
8.6 Fazit |
201 |
|
|
9 IPC – Inter Process Communication |
204 |
|
|
9.1 AIDL |
204 |
|
|
9.2 Implementierung |
205 |
|
|
9.3 Eigene Datenobjekte per IPC übertragen |
209 |
|
|
9.3.1 Eigene Datenobjekte erstellen |
209 |
|
|
9.3.2 Parameterübergabe optimieren |
212 |
|
|
9.4 Asynchrone Methodenaufrufe |
213 |
|
|
9.4.1 Asynchrone Methodenaufrufe mit Rückgabewert |
214 |
|
|
9.4.2 Asynchrone Methodenaufrufe verwenden |
218 |
|
|
9.5 Fazit |
221 |
|
|
10 Systemnachrichten |
222 |
|
|
10.1 Broadcast Intents |
222 |
|
|
10.2 Broadcast Receiver |
223 |
|
|
10.2.1 Dynamische Broadcast Receiver |
225 |
|
|
10.2.2 Statische Broadcast Receiver |
227 |
|
|
10.3 Meldungen an den Notification Manager |
237 |
|
|
10.4 Fazit |
241 |
|
|
11 Datenbanken |
242 |
|
|
11.1 Zielsetzung |
242 |
|
|
11.2 Android: Wozu Datenbanken? |
242 |
|
|
11.3 Das Datenbanksystem SQLite |
243 |
|
|
11.4 Eine Datenbank erstellen |
244 |
|
|
11.4.1 Berechtigungen |
244 |
|
|
11.4.2 Schemaverwaltung |
244 |
|
|
11.5 Datenzugriff programmieren |
247 |
|
|
11.5.1 SQLiteDatabase – Verbindung zur Datenbank |
248 |
|
|
11.5.2 Datenbankanfragen |
249 |
|
|
11.5.3 Ergebnistyp Cursor |
254 |
|
|
11.5.4 Änderungsoperationen |
256 |
|
|
11.6 Datenzugriff per Kommandozeile |
259 |
|
|
11.7 Implementierung |
261 |
|
|
11.7.1 Ein Architekturvorschlag |
261 |
|
|
11.7.2 Das Schema erstellen |
264 |
|
|
11.7.3 Anfrageergebnisse an der Oberfläche darstellen |
265 |
|
|
11.8 Spielzeit! |
267 |
|
|
12 Dateisystem |
268 |
|
|
12.1 Aufbau des Dateisystems |
268 |
|
|
12.1.1 Das Anwendungsverzeichnis |
268 |
|
|
12.1.2 SD-Karten |
268 |
|
|
12.2 Verwaltung |
269 |
|
|
12.3 Programmierung |
270 |
|
|
12.3.1 Zugriff auf das Anwendungsverzeichnis |
271 |
|
|
12.3.2 Zugriff auf die SD-Karte |
274 |
|
|
12.4 Zusammenfassung |
275 |
|
|
13 Content Provider |
276 |
|
|
13.1 Zielsetzung |
276 |
|
|
13.2 Übersicht/Grundbegriffe |
276 |
|
|
13.3 Content-URIs |
278 |
|
|
13.4 Content Provider |
280 |
|
|
13.4.1 Stammdaten |
281 |
|
|
13.4.2 Operationen |
281 |
|
|
13.4.3 Lebenszyklus |
283 |
|
|
13.4.4 Berechtigungen |
283 |
|
|
13.4.5 Deployment |
283 |
|
|
13.5 Content Consumer |
284 |
|
|
13.5.1 Content Resolver |
285 |
|
|
13.5.2 Zugriff auf Datenbankinhalte |
286 |
|
|
13.5.3 Zugriff auf Dateien |
287 |
|
|
13.6 Implementierung |
288 |
|
|
13.6.1 Zugriff auf das Android-Adressbuch |
288 |
|
|
13.6.2 Der FotoProvider |
290 |
|
|
13.6.3 FotoSpeicher als Content Consumer |
297 |
|
|
13.7 Content Provider für Fortgeschrittene |
299 |
|
|
13.7.1 Asynchrone Operationen |
299 |
|
|
13.7.2 Alternativen zum Content Provider |
301 |
|
|
14 Lebenszyklen |
302 |
|
|
14.1 Prozessverwaltung |
303 |
|
|
14.2 Lebenszyklus einer Activity |
304 |
|
|
14.3 Lebenszyklus eines Service |
307 |
|
|
14.4 Lebenszyklus eines Broadcast Receivers |
308 |
|
|
14.5 Activities: Unterbrechungen und Ereignisse |
309 |
|
|
14.6 onPause() vs. onSaveInstanceState(Bundle outState) |
310 |
|
|
14.7 Beispiele aus der Praxis |
315 |
|
|
14.7.1 Beispiel: Kalender-Activity |
315 |
|
|
14.7.2 Beispiel: E-Mail-Programm |
317 |
|
|
14.7.3 Beispiel: Quick-and-dirty-Alternative |
318 |
|
|
15 Datenübertragung |
320 |
|
|
15.1 Ziel |
320 |
|
|
15.2 Theoretische Grundlagen |
321 |
|
|
15.2.1 Das Emulator-Netzwerk |
321 |
|
|
15.2.2 Die Internet-Einbahnstraße |
323 |
|
|
15.2.3 Netzwerkunterstützung bei Android |
324 |
|
|
15.2.4 Arten der Netzwerkübertragung |
326 |
|
|
15.3 Netzwerken in der Praxis |
326 |
|
|
15.3.1 Verfahren 1: Geoposition senden |
327 |
|
|
15.3.2 Verfahren 2: dauerhafte Verbindung |
328 |
|
|
15.3.3 Auf Funklöcher reagieren |
332 |
|
|
15.4 Fazit |
334 |
|
|
16 Standortbezogene Dienste |
336 |
|
|
16.1 Ziel |
336 |
|
|
16.2 Theoretische Grundlagen |
337 |
|
|
16.2.1 GPS, KML und GPX |
337 |
|
|
16.2.2 Entwickeln im Emulator |
338 |
|
|
16.2.3 Debug Maps API-Key erstellen |
339 |
|
|
16.3 Praxisteil |
341 |
|
|
16.3.1 Vorbereitung |
341 |
|
|
16.3.2 Der Location Manager |
342 |
|
|
16.3.3 Google Maps |
344 |
|
|
16.3.4 MapActivity |
346 |
|
|
16.4 Fazit |
353 |
|
|
17 Debugging und DDMS |
358 |
|
|
17.1 Anschluss eines Android-Geräts |
358 |
|
|
17.2 Systemausgaben mit der LogCat |
359 |
|
|
17.3 DDMS: Dalvik Debug Monitor Service |
362 |
|
|
17.3.1 Emulator Control |
363 |
|
|
17.3.2 Debugging |
364 |
|
|
17.4 Traceview |
364 |
|
|
18 Sicherheit und Verschlüsselung |
368 |
|
|
18.1 Motivation |
368 |
|
|
18.2 Grundbegriffe der Verschlüsselung |
369 |
|
|
18.2.1 Verschlüsselte Datenübertragung |
370 |
|
|
18.2.2 Daten oder Objekte verschlüsseln |
385 |
|
|
18.2.3 Verschlüsselung anwenden |
387 |
|
|
19 Automatisiertes Testen |
390 |
|
|
19.1 Was testen wir? |
390 |
|
|
19.2 Oberflächentests |
392 |
|
|
19.2.1 Instrumentierung und robotium |
393 |
|
|
19.2.2 Ein Beispiel |
395 |
|
|
19.2.3 Konflikte vermeiden |
396 |
|
|
19.3 Modultests |
397 |
|
|
19.3.1 Androidfreie Klassen |
397 |
|
|
19.3.2 Androidabhängige Klassen |
398 |
|
|
19.3.3 Ein Beispiel |
399 |
|
|
19.4 Eine Teststrategie |
402 |
|
|
20 Anwendungen marktreif machen |
404 |
|
|
20.1 Hintergrundwissen |
404 |
|
|
20.2 Das Eclipse-Plugin verwenden |
405 |
|
|
20.3 Anwendungen mittels Kommandozeile marktreif machen |
406 |
|
|
20.3.1 Ein eigenes Zertifikat erstellen |
406 |
|
|
20.3.2 Eine Android-Anwendung signieren |
408 |
|
|
21 Optimierung und Performance |
410 |
|
|
21.1 Erste Optimierungsregeln |
410 |
|
|
21.2 Datenobjekte |
411 |
|
|
21.3 Cursor oder Liste? |
411 |
|
|
21.4 Time is Akku! |
412 |
|
|
Anhang |
414 |
|
|
Literaturverzeichnis |
418 |
|
|
Index |
422 |
|