Mobile Informationssysteme I

Werbung
Mobile Informationssysteme I
Peter Becker
Hochschule Bonn-Rhein-Sieg
Fachbereich Informatik
[email protected]
Vorlesung Sommersemester 2010
Vorbemerkungen
Allgemeines zur Vorlesung
• Homepage zur Veranstaltung:
http://www2.inf.fh-rhein-sieg.de/~pbecke2m/mobis1/
• Die Folien zur Vorlesung (Skript) stehen auf der Homepage vor der
Vorlesung zur Verfügung.
• Format: PDF, einseitig
• Folien sind knapp, hoher Selbstlernanteil
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
1
Vorbemerkungen
Übungen
• Beginn: 6. April 2010
• Pool-Raum C 063
• Programmieraufgaben, Literaturstudium, etc.
• Bearbeitungszeit: abhängig von den Aufgaben, i.d.R. ein bis zwei Wochen
• Sie bekommen Zugriff auf das Labor Wissens- und Informationsmanagement. ☞ ux-2e00.inf.fh-bonn-rhein-sieg.de
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
2
Vorbemerkungen
Lernziele
• Funktionsweise von Softwareschnittstellen für mobile Geräte kennenlernen
und verstehen.
• Vertiefte Kenntnisse in der Programmierung erlangen.
• Selbständig Programme für mobile Geräte entwickeln können.
• Aspekte des modernen Softwaredesigns kennenlernen und anwenden
können.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
3
Vorbemerkungen
Modulzuordnung und Studienleistung
• Modulgruppe: Wahlpflicht (WP)
4. Semester
• 2V + 3Ü, 5 Credits
• Prüfung in der letzten Semesterwoche oder den ersten Wochen des
Vorlesungszeitraums des folgenden Semesters
• Die Prüfungsform steht noch nicht fest, wahrscheinlich mündlich
• Prüfung über Inhalte der Vorlesung und Übung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
4
Vorbemerkungen
Inhalt
1. Software-Plattform Android
2. GUI-Programmierung für mobile Geräte
3. Persistenz und Datenbanken
4. Software-Komponenten in Android
5. Threads, Server-Prozesse, Benachrichtigungen
6. Netzwerkprogrammierung für mobile Geräte
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
5
Vorbemerkungen
Literatur
Reto Meier
Professional Android 2 Application Development
Wiley Publishing
2010
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
6
Vorbemerkungen
A. Becker, M. Pant
Android. Grundlagen und Programmierung
dpunkt Verlag
2009
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
7
Vorbemerkungen
Heiko Mosemann
Android. Anwendungen für das HandyBetriebssystem erfolgreich programmieren
Hanser Fachbuch
2009
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
8
1. Software-Plattform Android
Themenübersicht
1. Software-Plattform Android
Themen/Lernziele:
• Mobile Informationssysteme: Grundbegriffe
• Elementare Eigenschaften von Android
• Android Software Stack
• Entwicklungsumgebung
• Prozess der Entwicklung
• Erste Beispiele
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
9
1. Software-Plattform Android
Themenübersicht
Mobile Anwendung
• kommuniziert drahtlos mit anderen Anwendungen
• Ortsunabhängigkeit
• evtl. Lokalisierbarkeit
• Besondere Anforderungen an Sicherheit, Identifizierbarkeit, Verfügbarkeit,
Datenverteilung, Lastverteilung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
10
1. Software-Plattform Android
Themenübersicht
Mobiles Informationssystem
Ein Mobiles Informationssystem
• besteht aus einer oder mehreren mobilen Anwendungen und
• der darunter liegenden verteilten Datenhaltungsschicht.
Bei mobilem Zugriff auf zentral verfügbare Informationen spricht man von
einem Mobilität unterstützendem Informationssystem.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
11
1. Software-Plattform Android
Themenübersicht
Mobilität
Mobilität im Kontext mobiler Informationssysteme:
• geographische und zeitliche Änderungen einer mobilen Anwendung
Mobile Computing befasst sich mit
• dem Einsatz von Informationstechnologie in mobilen Umgebungen.
• Berücksichtigt u. a. die Kommunikation von mobilen Anwendungen oder
Clients untereinander.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
12
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
Mobile Computing
Sammelbegriff für eine Reihe von Forschungsfeldern, die sich mit der nichtstationären Nutzung von Computertechnologie beschäftigen, z.B.:
• Ubiquitous Computing
• Pervasive Computing
• Wearable Computing
• Nomadic Computing
• Mobile Communications
• Wireless Communications
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
13
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
Verwandte Begriffe
Nomadic Computing: Verwendung mobiler Clients zusammen mit drahtloser Netzwerktechnologie.
Stärkere Fokussierung auf die drahtlosen Kommunikationsfähigkeiten
mobiler Clients.
Ubiquitous Computing/Pervasive Computing: Weltweit vernetzte Systeme, die überall verfügbar sind und sich in Alltagsgegenstände integrieren.
Technische Umsetzung einer digitalen Dienstleistung bleibt u. U. verborgen.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
14
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
Mobilität und Drahtlosigkeit
drahtgebunden
drahtlos
nichtmobil
stationärer Rechner
Desktop mit WLAN
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
mobil
Netbook mit Kabelanbindung
Handy mit UMTS
15
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
Arten der Mobilität
Endgerätemobilität: mobiles Endgerät mit permanent gesichertem drahtlosen Zugriff auf ein Kommunikationsnetz.
Benutzermobilität: Ein Nutzer, der seinen Standort ändert, verwendet
beliebige fest installierte oder mobile Endgeräte.
Dienstmobilität: Ein Benutzer kann einen Kommunikations- oder Informationsdienst unabhängig vom Standort nutzen.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
16
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
Location Based Services
Anwendungen, die die aktuelle Position eines Nutzers/Clients ermitteln
und diese Position für die Erbringung der Nutzleistung ausnutzen heißen
Location Based Services (LBS).
Anwendungsgebiete für LBS:
• Suche nach speziellen Einrichtungen möglichst in der Nähe
• Navigation
• Lokalisation von Personen oder Objekten
• Verkehrsinformationen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
17
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
• Ortsabhängige Werbung
• Weitergabe der Positionsdaten im Notfall
• Dynamische ortsabhängige WWW-Links
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
18
1. Software-Plattform Android
Mobile Informationssysteme: Grundbegriffe
Arten der Positionsbestimmung
Tracking: Lokalisierung von Objekten oder Personen durch ein Sensornetz
Objekt/Person ist mit einer Marke (Tag) ausgestattet.
Positionsdaten liegen zunächst nur dem Positionsermittlungssystem vor.
Positioning: Das/der Objekt/Client ermittelt seine Position selbständig
System von Sendern oder Baken die Signale ausstrahlen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
19
1. Software-Plattform Android
Android
Was ist Android?
• Plattform und Betriebssystem für mobile Geräte (Smartphones, Mobiltelefone, Netbooks), Open-Source
• Linux-Kernel 2.6
• Managed Code, Angepasste Java Virtual Machine
• Bibliotheken, Laufzeitumgebung, Application Framework
• Entwicklungswerkzeuge
• Application Store (Andoid Market)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
20
1. Software-Plattform Android
Android
Wer steht hinter Android?
• Google
• Open Handset Alliance (OHA), 65 Firmen z.B.:
–
–
–
–
Google, eBay, ...
HTC, Motorola, ...
Intel, Qualcomm, ...
Vodafone, T-Mobile, ...
Ziel: Entwicklung von offenen Standards für mobile Geräte
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
21
1. Software-Plattform Android
Android
Aktuelle Versionen
• 1.5 Cupcake
• 1.6 Donut
• 2.0/2.1 EClair
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
22
1. Software-Plattform Android
Android
Andere Plattformen für mobile Geräte
• Symbian OS
• Java ME
• Windows Mobile
• iPhone OS
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
23
1. Software-Plattform Android
Android
T-Mobile G1 / HTC Dream
Das erste verfügbare Android-Mobiltelefon:
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
24
1. Software-Plattform Android
Android
Android-Anwendungsprogramme
• E-Mail Clients: GMail, POP3, IMAP
• Personal Information Management (PIM): Synchronisation mit Google
Calendar und Contacts
• WebKit-basierter Web-Browser
• SMS und Instant Messaging
• Android Market
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
25
1. Software-Plattform Android
Android
Android SDK Features
• XML-basiertes GUI-Layout (Trennung von Logik und Layout)
• Ünterstützung zur automatische Anpassung an verschiedene Konfigurationen (Sprache, Display, etc.)
• Integration von Ressourcen (Grafiken, Audiodateien, XML-Dateien, etc.)
• Internet-Kommunikation: TCP/IP, UDP und darauf basierende Protokolle
• Ad-Hoc Netzwerk: Bluetooth (RFCOMM bzw. SPP seit 2.0)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
26
1. Software-Plattform Android
Android
• Location API
• Kartendarstellungen (Google Maps)
• Zugriff auf Sensoren und Aktoren
• DBMS (sqlite)
• Wiedergabe verschiedener Medien-Formate
• Aufnahme von Fotos und Videos
• Komponententechnologie
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
27
1. Software-Plattform Android
Entwicklungsumgebung
Was beinhaltet die Entwicklungsumgebung
• Android API
• Entwicklungswerkzeuge
• Eclipse Plugin
• Android Virtual Device Manager
• Dokumentation
• Beispiel Quelltexte
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
28
1. Software-Plattform Android
Entwicklungsumgebung
Android Software Stack
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
29
1. Software-Plattform Android
Entwicklungsumgebung
Linux Kernel: Basis von Android, Version 2.6, enthält Hardwaretreiber
Android Runtime: Dalvik Virtual Machine
Jede Anwendung läuft in eigenem Prozess und eigener virtueller Maschine
Java Core Libraries kapseln Benutzung der Standard-Bibliotheken (Libraries)
Libraries: C-Bibliotheken für grundlegende Funktionalitäten wie Datenbank, 3D-Grafik, Netzwerkzugriff, etc.
Application Framework: Komponenten, die Systemdienste bereitstellen,
zur Nutzung in Anwendungen
Applications: Standard- und selbstentwickelte Anwendungen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
30
1. Software-Plattform Android
Entwicklungsumgebung
Dalvik Virtual Machine
• Android nutzt eine eigene virtuelle Java Maschine, die Dalvik Virtual
Machine.
• Dateiendung: .dex
• Basiert auf der Open-Source JVM Apache Harmony
• angepasst auf Effizienz für verschiedene Instanzen und Anforderungen für
mobile Endgeräte
• Ausnutzung der Registerarchitektur moderner Prozessoren, angepasst an
RISC-Architektur
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
31
1. Software-Plattform Android
Entwicklungsumgebung
• SDK enthält Werkzeug zur Umwandlung von .class-Dateien in .dexDateien.
• Keine Java-VM, daher keine Lizenzkosten an SUN, keine Auslieferung
der Änderungen von Apache Harmony notwendig, da Apache License
• Das benutzte Java API (viele Teile von J2SE) ist nicht geschützt.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
32
1. Software-Plattform Android
Entwicklungsumgebung
Aspekte der Anwendungsarchitektur
Wichtige Bestandteile der Android-Architektur:
• Activity: Sichtbarer Teil einer Anwendungen zur Interaktion mit dem
Benutzer, eigener Lebenszyklus, vgl. Applet, MIDlet
• Service: Teile einer Anwendung ohne Oberfläche für Hintergrundarbeiten
• Content Providers: Bereitstellung von Daten über Anwendungsgrenzen
hinweg
• Broadcast Receiver: Teile einer Anwendung die auf Systemereignis lauschen und reagieren können
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
33
1. Software-Plattform Android
Entwicklungsumgebung
• Intents: Komponententechnologie, zur Verbindung von Komponenten
• Views: Konstruktionselemente für Benutzerschnittstellen
• Resource Manager: Einfacher Zugriff auf Non-Code Ressourcen einer
Anwendung
• Notification Manager: Signalisierung von Ereignissen an den Benutzer
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
34
1. Software-Plattform Android
Android Entwicklung
Entwicklungswerkzeuge
Grundlegenden Werkzeuge:
• Android Emulator bzw. Android Virtual Device Manager (AVD)
• Dalvik Debug Monitoring Service (DDMS)
• Android Asset Packaging Tool (AAPT)
• Android Debug Bridge (ADB)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
35
1. Software-Plattform Android
Android Entwicklung
Weitere Helfer
• SQLite3: Zugriff auf SQLite-Datenbaken
• Traceview: Graphische Analyse der Trace-Logs von Android Anwendungen
• MkSDCard: Erzeugt ein SDCard Image für den Emulator
• dx: Wandelt .class Dateien in .dex Dateien
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
36
2. GUI-Programmierung für mobile Geräte
Lernziele
2. GUI-Programmierung für mobile Geräte
Themen/Lernziele:
• Einführung Lebenszyklus einer Android-Anwendung
• Beispiele
• GUI-Elemente
• Einbindung externer Ressourcen
• Activity und Manifest
• Entwicklung eigener GUI-Klassen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
37
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Aus was besteht eine Android-Anwendung?
Vgl. Folie 33:
Activity: Jede Anwendung besteht aus mindestens einer Activity: Vordergrundprozess, zuständig für die Anzeige
Service: Hintergrundprozess
Content Provider: Datenbereich, der für verschiedene Anwendungen zur
Verfügung steht.
Intent: Message-Passing-Framework für den lose gekoppelten Nachrichtenaustausch zwischen Activities und/oder Services.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
38
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Broadcast Receiver: Empfänger von Intents, Angabe von Bedingungen
möglich, für ereignis-gesteuerte Anwendungen
Notification: Benachrichtigungen an den Benutzer ohne Wechsel der Activity im Vordergrund.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
39
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Android-Projekt in Eclipse
Im Wurzelverzeichnis eines Projektes:
• AndroidManifest.xml
XML-Datei zur Beschreibung der Anwendung, z. B. aus welchen Komponenten (Activities, Services, etc.) die Anwendung besteht.
• default.properties
Meta-Information, automatisch
z.B. Zielplattform (API Level)
erzeugt,
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
40
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
• bin/
Enthält die compilierte und gebundene Applikation inklusive der apkDatei
• src/
Java-Quelltexte
• gen/
Automatisch generierte Quelltext-Dateien, hier insbesondere die Klasse
R.java
• res/
Non-Code Ressourcen, z.B. Grafiken, Layouts, Stringdefinitionen etc.,
werden eingebunden in das Anwendungspaket (.apk).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
41
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
• assets/
Weitere statische Dateien, die in die Anwendung eingebunden werden
sollen.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
42
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Ressourcen
• res/drawable/ für Grafiken/Bilder (PNG, JPEG, etc.)
• res/layout/ für XML-basierte Layout-Definitionen
• res/values/ für Strings und Definitionen, z.B. für Lokalisation
• res/xml/ für sonstige XML-Dateien
• res/raw/ für sonstige Dateien
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
43
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Dateien der Android-Anwendung
Das Ergebnis der Compilierung/Erzeugung einer Anwendung liegt in bin/.
• bin/classes/ enthält die compilierten Java-Klassen im üblichen JVMBytecode.
• bin/classes.dex die ausführbare Anwendung erzeugt aus den compilierten Java-Klassen
• bin/DeineApp.apk ist die Android-Anwendung fertig zur Installation.
Die .apk-Datei ist ein ZIP-Archiv bestehend aus der .dex-Datei, den
Ressourcen, der Manifest-Datei und weiteren Dateien.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
44
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Activity ganz simpel (1)
Mit dem Anlegen eines Android-Projekts über Eclipse werden automatisch
zwei Java-Klassen generiert:
• MeineActivity.java: Einfachster Rahmen für eine Activity-Klasse, abgeleitet von android.app.Activity.
• R.java: Definiert symbolische Konstanten für die Ressourcen der Anwendung.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
45
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Aufbau der erzeugten Activity-Klasse:
package meineAnwendung;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
46
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Schematischer Aufbau der erzeugten Klasse R:
/* AUTO-GENERATED FILE.
DO NOT MODIFY. */
package mobis1.b1;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int myButton=0x7f050001;
public static final int myTextView=0x7f050000;
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
47
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
48
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Damit die Activity etwas anzeigt, muss ihr mit Hilfe von setContentView
ein View-Objekt zugeordnet werden. Hierzu gibt es zwei Möglichkeiten:
• Wir erzeugen passende View-Instanzen und weisen diese der Activity zu:
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
MyView myView = new MyView(this);
this.setContentView(myView);
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
49
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
• Wir nutzen eine vordefinierte Layout-Definition aus den Ressourcen:
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
this.setContentView(R.layout.myLayout);
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
50
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Activity ganz simpel (2)
• Eine Activity ermöglicht das Anzeigen einer UI-Komponente mittels
der Methode setContentView().
• Die UI-Komponenten selbst sind von der Klasse android.view.View
abgeleitet.
• Für das Anzeigen verschiedener UI-Komponenten benötigen wir entweder
– verschiedene Activities oder
– eine saubere Logik um mittels setContentView() zwischen den UIKomponenten zu wechseln.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
51
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Activity ganz simpel (3)
Um eine Activity in einer Anwendung nutzen zu können, muss sie im
Manifest definiert werden:
<activity android:label="@string/app_name"
android:name=".MyActivity"
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Nur für die mit Projektdefinition erzeugte Activity geschieht dies automatisch.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
52
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Activity Stack
• Android verwaltet die Activities auf einem Stack.
• Wenn eine neue Activity startet, wird die zuletzt aktive Activity auf den
Stack gelegt.
• Wird die sich im Vordergrund befindliche Activity geschlossen oder der
Benutzer benutzt den Back-Button, dann wird die oberste Activity des
Stacks aktiv.
• Tief im Stack befindliche Activities können von der AndroidLaufzeitumgebung “gelöscht” werden, um ausreichend Ressourcen bereit
zu stellen.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
53
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Zustände einer Activity
active: Sichtbare Activity, bereit Eingaben zu empfangen (Focus), liegt
oben auf dem Stack.
Android versucht dieser Activity alle notwendigen Ressourcen bereit zu
stellen, eventuell durch “kill” anderer nicht aktiver Activities.
Wird eine andere Activity “active”, geht diese Activity in den Zustand
“paused” oder “stopped” über.
paused: Die Activity ist sichtbar, hat aber nicht den Focus.
Entsteht wenn eine andere Activity, die transparent ist oder nicht den
ganzen Schirm abdeckt, sich überhalb der Activity befindet (Beispiel:
Dialog).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
54
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Wird wie eine aktive Activity behandelt, empfängt einer keine Benutzereingaben.
Wird eine Activity vollständig verdeckt, geht sie in den Zustand “stopped”
über.
stopped: Die Activity ist nicht mehr sichtbar.
Sie verbleibt zunächst im Speicher, kann aber jederzeit von Android
Laufzeitumgebung entfernt werden. Dann ist sie “inactive”.
inactive: Eine inaktive Activity muss neu gestartet werden, damit sie wieder
angezeigt und benutzt werden können.
Die Zustandsübergänge werden vollständig von der AndroidLaufzeitumgebung initiiert. Eine Anwendung hat aber die Möglichkeit, auf
die Zustandsübergänge zu reagieren.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
55
2. GUI-Programmierung für mobile Geräte
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
Einführung Lebenszyklus
56
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Methoden für Zustandsübergänge
Damit eine Activity auf die Zustandsübergänge reagieren kann, bietet sie
entsprechende Methoden an:
• void onCreate(Bundle bundle)
• void onStart()
• void onRestart()
• void onResume()
• void onPause()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
57
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
• void onStop()
• void onDestroy()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
58
2. GUI-Programmierung für mobile Geräte
Einführung Lebenszyklus
Activity Lifetimes
Entire Lifetime: zwischen onCreate() und onDestroy()
Legen Sie in onCreate() alles an, was Sie auf jeden Fall brauchen und
sorgen Sie in onDestroy() dafür, dass alle noch belegten Ressourcen
freigegeben werden.
Visible Lifetime: zwischen onStart() und onStop()
Behandlung von Ressourcen die für die Anzeige benötigt werden.
Foreground Lifetime: Zwischen onResume() und onPause()
Mehrfacher Wechsel des Zustands möglich, tritt z.B. auf, wenn das
Telefon in den Ruhezustand übergeht.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
59
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Views und Layouts
View: Basisklassen für visuelle Komponenten. Alle UI-Komponenten sind
von der Klasse View abgeleitet.
ViewGroup: Klassen, die mehrere Views bündeln. Hierzu gehören z.B. die
Layout-Klassen wie LinearLayout.
Eine ViewGroup ist eine spezielle View.
Widget: View, die zur Interaktion mit dem Benutzer verwendet wird.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
60
2. GUI-Programmierung für mobile Geräte
Views und Layouts
View-Hierarchie
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
61
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Grundlegende Widgets
• TextView: Read-Only Text, unterstützt Formatierung
• EditText: Editierbare TextView
• ListView: ViewGroup zum Anzeigen einer Liste von textuellen Einträgen,
jeder Eintrag wird dargestellt durch eine einzelne View (üblicherweise
TextView)
• Spinner: Komposition von TextView und ListView. Der über die ListView
ausgewählte Eintrag wird in der TextView angezeigt.
• Button: gewöhnlicher Push-Button
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
62
2. GUI-Programmierung für mobile Geräte
Views und Layouts
• CheckBox: Button mit zwei Zuständen (selektiert bzw. nicht selektiert)
• RadioButton: Gruppierte Buttons mit zwei Zuständen und wechselseitigem Ausschluss
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
63
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Layout-Klassen
• LinearLayout: Horizontale oder vertikale Ausrichtung der enthaltenen
Views. Verschachtelung möglich!
• FrameLayout: Jede View wird in der linken oberen Ecke plaziert.
• RelativeLayout: Positionierung von Views relativ zu den anderen Views
und den Bildschirmgrenzen
• TableLayout: Aufteilung in Zeilen und Spalten. Bildschirmelemente
können mehrere Zeilen/Spalten umfassen, Zeilen können schrumpfen
und wachsen.
• AbsoluteLayout: Positionierung auf der Basis von absoluten Koordinaten.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
64
2. GUI-Programmierung für mobile Geräte
Views und Layouts
XML-basierte Layout-Definitionen
Gerüst, z.B. für LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android">
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
...
</LinearLayout>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
65
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Layout-Attribute
Wichtige Attribute (nicht nur für LinearLayout):
• android:orientation: Ausrichtung beim Layout, vertical oder
horizontal
• android:layout width: Art des horizontalen Füllens, fill parent
oder wrap content
• android:layout height: analog für vertikales Füllen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
66
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Kopplung der Komponenten
Die Hierarchie der Views spiegelt sich in der XML-Definition wider:
<LinearLayout ...>
<Button .../>
<TextView .../>
<LinearLayout ...>
<TextView .../>
<EditText .../>
</LinearLayout>
</LinearLayout>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
67
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Identifikation von Objekten
• Jede View kann durch android:id mit einer ID versehen werden.
• Aufbau der ID: @+id/kennung , z.B.
android:id="@+id/mybutton"
• Mit Hilfe der Methode findViewById erhält man innerhalb der Applikation das zugehörige Objekt:
Button button = (Button)findViewById(R.id.mybutton);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
68
2. GUI-Programmierung für mobile Geräte
Views und Layouts
Beispiel: Identifikation von Objekten
Beispiel 2.1. Aktuelle Uhrzeit auf Knopfdruck
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
69
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: TextView
Nicht editierbarer Text, z.B. als Label verwendbar. Einige Attribute:
• android:text
• android:typeface
• android:textStyle
• android:textColor
Java-Methode, um den Text zu setzen: setText
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
70
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: ImageView
• Zeigt ein Bild/Grafik an.
• Bild wird referenziert durch XML-Attribut android:src mit Referenz
auf eine Drawable-Ressource:
android:src="@drawable/mypic"
• Dynamisches Ändern des Bildes mit der Methode setImageURI().
Benötigt einen Content-Provider.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
71
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: Buttons
• Button ist eine Unterklasse von TextView, entspricht dem gewöhnlichen
Push-Button
• Button-Label entspricht android:text
• ImageButton: Push-Button mit Bild statt Textbeschriftung, abgeleitet
von ImageView.
• Reagieren auf Clicks: setOnClickListener(), Listener muss Interface
View.OnClickListener implementieren (siehe Beispiel 2.1).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
72
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: EditText
• Editierbares Textfeld, abgeleitet von TextView
• automatische Rechtschreibunterstützung: android:autoText
• Großschreibung des ersten Buchstabens: android:capitalize
• Feld erlaubt nur Ziffern: android:digits
• Ein- oder mehrzeilige Eingabe? android:singleLine
• Nur numerische Eingaben erlauben: android:numeric
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
73
2. GUI-Programmierung für mobile Geräte
Spezielle Views
• Telefonnummern: android:phoneNumber
• Passwort: android:password
• Eigene Konsistenzprüfungen mit eigener Implementierung der Schnittstelle InputMethod: android:inputMethod
• Zugriff auf den Inhalt: getText()
Für einfachen String: getText().toString()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
74
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: CheckBox
• Checked or Unchecked?
• TextView ist Vorfahr, android:text liefert Label und ist entsprechend
veränderbar
• Java-Methoden:
– isChecked()
– setChecked()
– toggle()
• Listener-Interface: OnCheckedChangeListener() mit Methode onCheckedChange()
• Zum setzen des Listener-Objekts: setOnCheckedChangeListener()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
75
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: RadioButton und RadioGroup
• RadioButton ist der einzelne Button, RadioGroup eine Menge von
Buttons, von denen höchstens einer im Zustand “checked” ist.
• TextView ist Vorfahr von RadioButton
• Java-Methoden für RadioGroup:
– check(): prüft, ob ein Button im Zustand “checked” ist.
– clearCheck(): Setzt alle Buttons der Gruppe in den Zustand “unchecked”.
– getCheckRadioButtonId(): Liefert die ID des einen Buttons der im
Zustand “checked” ist (oder -1).
• Die RadioButtons innerhalb der Gruppe haben die üblichen Methoden
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
76
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Views: Allgemeine Eigenschaften
• Sichtbarkeit kann mit Hilfe von android:visibility geregelt werden
• visible, invisible, gone
• Hintergrund: android:background
• setEnabled() und isEnabled() für das Ein-/Ausschalten von interaktiven Views (z.B. EditText)
• Weitere wichtige Java-Methoden: getParent(), getParentOfType(),
findViewById(), getRootView()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
77
2. GUI-Programmierung für mobile Geräte
Spezielle Views
LinearLayout
Lineare Anordnung der enthaltenen Views, Layouts in Layouts ist möglich
Eigenschaften einer LinearLayout-Instanz:
Orientierung: horizontale oder vertikale Anordnung
android:orientation bzw. setOrientation()
Füllmodell: für die Horizontale: android:layout width
für die Vertikale: android:layout height
Legt die Größe für die Layout-Instanz fest:
• spezifische Dimension z. B. in Pixeln
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
78
2. GUI-Programmierung für mobile Geräte
Spezielle Views
• wrap content: natürliche Größe, evtl. Zeilen oder Spaltenumbruch
erforderlich
• fill parent: Der ganze verfügbare Platz wird ausgefüllt
Relative Größenangaben: Bei Verwendung von fill parent: Mit Hilfe
von android:layout weight kann ein Anteil für die Größe auf dem
Schirm festgelegt werden.
Ausrichtung: layout gravity bestimmt die Ausrichtung der enthaltenen
Views
left, center horizontal, center vertical, right,
Zwischenraum: Mit Hilfe der Padding-Attribute kann zusätzlicher Zwischenraum eingefügt werden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
79
2. GUI-Programmierung für mobile Geräte
Spezielle Views
TableLayout
• TableLayout unterstützt die Positionierung von Komponenten in einem
Gitter ähnlich einer HTML-Table.
• Zu TableLayout gehört TableRow zur Definition einer Tabellenzeile.
• In TableRow sind die GUI-Komponenten enthalten.
• Die Anzahl der Spalten wird automatisch bestimmt.
• Eine Komponente in einer Zeile kann mehrere Spalten umfassen. Hierzu
dient das Attribut android:layout span.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
80
2. GUI-Programmierung für mobile Geräte
Spezielle Views
• Eine Komponente kann auch explizit in eine Spalte gesetzt werden.
android:layout column.
Tabellenzeile über drei Spalten:
<TableRow>
<TextView android:text="URL:"/>
<EditText android:id="@+id/entry"
android:layout_span="3"/>
</TableRow>
Buttons in Spalte zwei und drei:
<TableRow>
<Button android:id="@+id/cancel"
android:layout_column="2"
android:text="Cancel" />
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
81
2. GUI-Programmierung für mobile Geräte
Spezielle Views
<Button android:id="@+id/ok" android:text="OK"/>
</TableRow>
Komponenten, die außerhalb von TableRow deklariert werden, verhalten sich
ähnlich wie LinearLayout (mit Ausrichtung vertical und fill parent).
Dies kann man für die Definition von Trennelementen nutzen:
<TableRow>
...
</TableRow>
<View android:layout_height="2px"
android:background="#0000FF"/>
<TableRow>
...
</TableRow>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
82
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Dehnbare Spalten in TableLayout
• Standard: Spalten erhalten natürliche Größe auf Basis der enthaltenen
Komponenten
• Zur Ausdehnung von Spalten
android:stretchColumns
auf
die
volle
mögliche
Größe:
Attributwert: Spaltennummer oder Kommaliste von Spaltennummern
• android:shrinkColumns um durch Zeilenumbruch Spalten zu verschmälern
• Spalten zunächst unsichtbar: android:collapseColumns
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
83
2. GUI-Programmierung für mobile Geräte
Spezielle Views
• Java-Methoden zur Kontrolle:
– setColumnsStretchable()
– setColumnsShrinkable()
– setColumnsCollapsed()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
84
2. GUI-Programmierung für mobile Geräte
Spezielle Views
Scrolling
ScrollView stellt für die enthaltenen Views Scrolling bereit:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
<TableLayout ...>
<TableRow ...>
</TableRow>
...
<TableRow ...>
</TableRow>
</TableLayout>
</ScrollView>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
85
2. GUI-Programmierung für mobile Geräte
Log Messages
Log Messages
Die Klasse android.util.Log stellt Klassenmethoden für das Logging
bereit:
• Log.e(): Fehler
• Log.w(): Warnungen
• Log.i(): Informationen
• Log.d(): Debugging
• Log.v(): Verbose
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
86
2. GUI-Programmierung für mobile Geräte
Log Messages
Alle Methoden erwarten als Parameter zwei Strings:
• Ein Tag für die Quelle der Nachricht/Meldung
• Die Nachricht/Meldung
Man kann sich die Meldungen mit der LogCat View in Eclipse anschauen
oder durch Aufruf des Programms logcat auf dem Gerät/Emulator.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
87
2. GUI-Programmierung für mobile Geräte
Listen
Auswahlkomponenten
• Übliche Auswahlkomponente: ListView
• Wie üblich einbettbar in Layout-Komponenten
• Kontrolle der Anzeige mit Hilfe eines Adapters
• Einfachster Adapter: ArrayAdapter
• Listener für Auswahl
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
88
2. GUI-Programmierung für mobile Geräte
Listen
Adapter
• public interface Adapter
• Ein Adapter realisiert eine Verbindung zwischen einer AdapterView und
den Daten, die die View präsentieren soll.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
89
2. GUI-Programmierung für mobile Geräte
Listen
ArrayAdapter
• Generischer Typ: ArrayAdapter<T>
• Konstruktorargumente: Kontext (typischerweise Activity), View-ID für
Listenelemente, Array
• Methoden um das Datenarray zu manipulieren:
–
–
–
–
add()
clear()
insert()
remove()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
90
2. GUI-Programmierung für mobile Geräte
Listen
Skizze:
String[] items = { "eins", "zwei", "drei" };
ArrayAdapter<String> aa;
aa = new ArrayAdapter<String>(myActivity,
android.R.layout.simple_list_item_1, items);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
91
2. GUI-Programmierung für mobile Geräte
Listen
Weitere Adapter
• CursorAdapter: Für Daten, die von einem Content Provider bereitgestellt werden
• SimpleAdapter: Zugriff auf Daten aus XML-Ressourcen
• ActivityAdapter: Namen von Activities, die für einen Intent aufgerufen
werden können
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
92
2. GUI-Programmierung für mobile Geräte
Listen
ListView
• Muss mit Adapter verbunden werden: setAdapter()
• Schnittstelle für Listener: AdapterView.OnItemClickListener
• Zu implementierende Methoden:
public void onItemClick(AdapterView parent, View v,
int position, long id);
• Listener setzen: setOnItemClickListener()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
93
2. GUI-Programmierung für mobile Geräte
Listen
Beispiel: ListView
Beispiel 2.2. Statischen Liste in Verbindung
mit einer TextView für die Anzeige des ausgewählten Elements
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
94
2. GUI-Programmierung für mobile Geräte
Listen
ListActivity
• Für eine Activity, die durch eine Liste dominiert wird: ListActivity
• Hier ist die ListView schon integriert.
• Setzen der Daten bzw. des Adapters: setListAdapter()
• Zur Behandlung einer Auswahl: Überschreiben der Methode
public void onListItemClick(ListView parent, View v,
int position, long id);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
95
2. GUI-Programmierung für mobile Geräte
Listen
Weitere Auswahlkomponenten
• Spinner: Anzeige des ausgewählten Elements in Kombination mit einer
Drop-Down Liste
• GridView: Zweidimensionale Auswahlmatrix
• Gallery: Horizontales Auswahlelement
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
96
2. GUI-Programmierung für mobile Geräte
Tabbed Layouts
Tabbed Layouts
• TabHost: Container für die Tab-Buttons und die Inhalte der Tabs
• TabWidget: implementiert die Zeile für die Tab-Buttons
• FrameLayout: Container für die Tab-Inhalte
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
97
2. GUI-Programmierung für mobile Geräte
Tabbed Layouts
Regeln für Tabbed Layouts
• ID für TabWidget muss @android:id/tabs sein.
• Padding für die Tab-Buttons im Frame-Layout
• Falls man TabActivity benutzen möchte, muss TabHost die ID
@android:id/tabhost haben.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
98
2. GUI-Programmierung für mobile Geräte
Tabbed Layouts
<LinearLayout ...>
<TabHost android:id="@+id/tabhost"
<TabWidget android:id="@android:id/tabs"
... />
<FrameLayout android:id="@android:id/tabcontent"
...
android:paddingTop="62px">
<View .../>
...
<View .../>
</FrameLayout>
</TabHost>
</LinearLayout>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
99
2. GUI-Programmierung für mobile Geräte
Tabbed Layouts
Zusammenfügen der Tabs
• Aufruf der Methode setup() auf dem TabHost
• Erzeugung von TabHost.TabSpec-Objekten mittels newTabSpec(). Damit werden die Tabs definiert.
• setContent() um den Inhalt für ein Tab festzulegen
• setIndicator() für den Text des Tab-Buttons
• addTab() auf dem TabHost um den Tab hinzuzufügen
• setCurrentTab() um den aktuellen Tab einzustellen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
100
2. GUI-Programmierung für mobile Geräte
Tabbed Layouts
Beispiel: Tabs
Beispiel 2.3. Anwendung mit zwei Tabs, einer Uhr und einem Button
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
101
2. GUI-Programmierung für mobile Geräte
Menüs
Menüs
Android kennt drei Arten von Menüs:
• Options Menu
Erscheint wenn der “Menü”-Knopf des Gerätes bedient wird
Menüs sind abhängig von der Activity.
• Context Menu
Beziehen sich auf eine View
erscheinen durch “taps-and-hold”
• Sub Menus
Keine Ünterstützung von Icons oder Menüschachtelung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
102
2. GUI-Programmierung für mobile Geräte
Menüs
Für Menüs gilt allgemein:
• Keine volle Kontrolle durch den Entwickler
• Handling im Framework enthalten
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
103
2. GUI-Programmierung für mobile Geräte
Menüs
Menu Item
Für jeden Menüeintrag (MenuItem) muss angegeben werden:
• “Gruppenwert” für eine eventuelle Gruppierung (ansonsten Menu.NONE)
• Eindeutige Kennung (typischerweise Menu.FIRST+N )
• Wert für die Sortierung der Menüeinträge
• Menütext
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
104
2. GUI-Programmierung für mobile Geräte
Menüs
Options Menu
• Keine Konstruktion des Menüs als Objekt!
• Stattdessen:
Überschreiben
onCreateOptionsMenu()
von
Methode liefert über Parameter ein
Menüobjekt, das manipuliert werden kann.
• Methode add() um Menüeinträge hinzuzufügen. Liefert ein MenuItem.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
105
2. GUI-Programmierung für mobile Geräte
Menüs
• Weitere Einstellung mit MenuItem möglich, z.B. setIcon()
• Für die Selektion benötigen die Menüeinträge Kennungen, ideal hierfür
die Konstante Menu.FIRST
• Für das Abfangen der Auswahl ist kein Listener erforderlich, stattdessen
überschreiben der Methode
public boolean onOptionsItemSelected(Menu.Item item);
• Methode getItemId() von MenuItem liefert die Kennung des ausgewählten Menüeintrags.
• Rückgabewert gibt an, ob Auswahl komplett behandelt wurde
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
106
2. GUI-Programmierung für mobile Geräte
Menüs
Dynamische Anpassung des Option Menu
• Dynamische Anpassung des Menüs durch Überschreiben von
public boolean onPrepareOptionsMenu(Menu menu);
• Wird immer aufgerufen bevor ein Options Menu angezeigt wird.
• Für Referenz auf den Menüeintrag: findItem()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
107
2. GUI-Programmierung für mobile Geräte
Menüs
Beispiel: Options Menu
Beispiel 2.4. Anwendung mit Options Menu zur Erzeugung von Dialogs
(About, Help), zu Dialog siehe folgende Folien
Siehe Folie 105 und Folie 113
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
108
2. GUI-Programmierung für mobile Geräte
Menüs
Context Menu
• Kontext: View, die aktuell den Focus hat
• Menü kann an der View-Klasse hängen: Überschreiben der Methode:
protected void onCreateContextMenu(ContextMenu menu);
• Menü kann aber auch spezifisch für eine Activity sein: rufe Methode
registerForContextMenu() einer Activity auf
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
109
2. GUI-Programmierung für mobile Geräte
Menüs
• Für registrierte Views wird die folgende Methode aufgerufen, wenn das
Context Menu angezeigt werden soll:
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo);
• Handling einer Auswahl durch Überschreiben der folgenden ActivityMethode:
public boolean onContextItemSelected(MenuItem item);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
110
2. GUI-Programmierung für mobile Geräte
Menüs
Menu Item Click Listener
Alternative zum Überschreiben der Activity-Methoden für Click-Listening
bei Menüs: Schnittstelle OnMenuItemClickListener
• Aufruf erfolgt auf dem erzeugten menuItem
• Methode zum Setzen: setOnMenuItemClickListener()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
111
2. GUI-Programmierung für mobile Geräte
Menüs
• Einfache Implementierung mit anonymer Klasse:
menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
...
return true;
}
});
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
112
2. GUI-Programmierung für mobile Geräte
Dialogs
Dialogs und Pop-Up Messages
Ein Dialog ist ein transparentes Fenster, das eine andere Activity teilweise
überdeckt.
Möglichkeiten, einen Dialog zu erzeugen:
• Eine von Dialog abgeleitete Klasse verwenden, z.B. AlertDialog
• Theme-Attribut
einer
Theme.Dialog einstellen
Activity
auf
• Toasts: Kleine sich selbst auflösende Nachrichtenfenster
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
113
2. GUI-Programmierung für mobile Geräte
Dialogs
AlertDialog
• Titel: setTitle()
• Icon: setIcon()
• Text/Nachricht: setMessage()
• Bis zu drei Buttons: Postive, Negative, Neutral
setPositiveButton(), ...
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
114
2. GUI-Programmierung für mobile Geräte
Dialogs
AlertDialog.Builder
• Klasse zur automatischen Erzeugung eines AlertDialogs.
• Bietet die Methoden der vorigen Folie
• Skizze zur Nutzung:
AlertDialog.Builder ad = new AlertDialog.Builder(activity);
ad.setTitle(...) ...
db.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id) {
...
}});
return ad.create();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
115
2. GUI-Programmierung für mobile Geräte
Dialogs
Verbindung mit Activity
• Jeder Dialog erhält eine eindeutige Kennung.
• showDialog(dialogID) um einen Dialog anzuzeigen
• Wenn Dialog erzeugt werden muss, erfolgt Aufruf der Activity-Methode:
public Dialog onCreateDialog(int id)
In Methode typischerweise switch zur Erzeugung des passenden Dialogs
(z.B. mittels AlertDialog.Builder).
• Vor dem Anzeigen erfolgt Aufruf der Activity-Methode:
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
116
2. GUI-Programmierung für mobile Geräte
Dialogs
public void onPrepareDialog(int id, Dialog dialog)
Damit Anpassung an Situation möglich.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
117
2. GUI-Programmierung für mobile Geräte
Dialogs
Activities als Dialogs
• Eine Activity kann in Form eines Dialog realisiert werden.
• Vorteil: alle Möglichkeiten zur Implementierung
• Nachteil: Einfache Handhabung der Dialog-Klasse geht verloren
• <activity android:name="MyDialogActivity"
android:theme="@android:style/Theme.Dialog">
</activity>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
118
2. GUI-Programmierung für mobile Geräte
Dialogs
Toasts
• Ein Toast ist eine kleine Dialogbox, die eine Textnachricht anzeigt und
nach wenigen Sekunden automatisch verschwindet.
• Skizze zur Nutzung:
Toast toast = Toast.makeText(context, "Meine Nachricht",
Toast.LENGTH_SHORT);
toast.show();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
119
2. GUI-Programmierung für mobile Geräte
Dialogs
Beispiel: Dialog und Toast
Beispiel 2.5. Anwendung mit zwei Buttons:
einer zur Erzeugung eines Dialog, einer zur
Erzeugung eines Toast
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
120
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Widgets für Datum und Uhrzeit
• Datumsauswahl
DatePicker, DatePickerDialog
• Uhrzeitauswahl
TimePicker, TimePickerDialog
• Zeitanzeige
AnalogClock, DigitalClock
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
121
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Datumsauswahl
• Widget für die Datumsauswahl: DatePicker
• Datum kann eingestellt werden
• Für die Verwaltung von Zeitstempeln (Datum + Uhrzeit): Calendar
• Widget verpackt in einem Dialog: DatePickerDialog
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
122
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Listener für DatePicker
• Listener-Schnittstelle: DatePicker.OnDateSetListener
• mit Methode:
public void dateSet(DatePicker view, int year, int month, int day);
• Listener steht auch für DatePickerDialog zur Verfügung.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
123
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Auswahl einer Uhrzeit
• Widget für die Datumsauswahl: TimePicker
• Uhrzeit kann eingestellt werden
• Für die Verwaltung
java.util.Calendar
von
Zeitstempeln
(Datum
+
Uhrzeit):
• Formatierung von Zeitstempeln: java.text.DateFormat
• Widget verpackt in einem Dialog: TimePickerDialog
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
124
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Listener für TimePicker
• Listener-Schnittstelle: TimePicker.OnTimeSetListener
• mit Methode:
public void timeSet(TimePicker view, int hour, int minute);
• Listener steht auch für TimePickerDialog zur Verfügung.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
125
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Beispiel: DatePicker und TimePicker
Beispiel 2.6. Layout mit zwei Buttons und
einer TextView
Mit Hilfe der beiden Buttons wird
ein
DatePickerDialog
bzw.
ein
TimePickerDialog angezeigt. Das ausgewählte Datum bzw. die ausgewählte Uhrzeit
wird in die TextView übernommen.
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
126
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Anzeige der Uhrzeit
• analoge Uhr: AnalogClock
nur Stunden- und Minutenzeiger
• digitale Uhr: DigitalClock
zeigt auch Sekunden an
Anpassung an Landeseinstellung
• Uhrzeit wird automatisch angepasst, kein Listener/Updater erforderlich
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
127
2. GUI-Programmierung für mobile Geräte
Widgets für Datum und Uhrzeit
Beispiel: Uhrzeit
Beispiel 2.7. Uhrzeit analog und digital
Reine Layout-Definition, keine weitere Programmierung erforderlich
Layout siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
128
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Einbettung des Web-Browsers
• Einbettung des Standard-Browsers in eigene Anwendungen
• Browser basiert auf WebKit
• Klasse: WebView
• eigenes Package: android.webkit mit vielen weiteren Klassen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
129
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Beispiel: WebView
Beispiel 2.8. Simples Layout mit einer
WebView
Laden einer Seite mit Hilfe der Methode
loadUrl()
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
130
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Permission
• Für den Webzugriff ist eine Uses Permission notwendig.
• Einzutragen in AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
• Kann mit Hilfe des Manifest-Editors eingetragen werden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
131
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Anzeigen von Inhalten
Daten können mit folgenden Methoden geladen werden:
• loadUrl(String url)
• loadData(String data, String mimeType, String encoding)
• Zum setzen einer Basisadresse für den Inhalt:
loadDataWithBaseURL(...)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
132
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Navigation
Navigationsfunktionalität muss selbst implementiert werden. Methoden
hierfür:
• reload()
• goBack()
• goForward()
• canGoBackOrForward()
• clearCache(), clearHistory()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
133
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Reaktion auf Benutzeraktionen
• Mit einem WebViewClient kann auf Benutzeraktionen reagiert werden.
• Methode setWebViewClient() um den WebViewClient bei der WebView
zu registrieren.
• Reaktion durch Überschreiben von Methoden im WebViewClient.
• Beispiel: shouldOverrideUrlLoading() zur Reaktion auf interne URLs
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
134
2. GUI-Programmierung für mobile Geräte
Einbettung des Web-Browsers
Einstellungen
• erfolgen mit einer Instanz von WebSettings, Instanz wird erzeugt durch
getSettings() auf WebView
• Beispielmethoden:
– Einstellung
von
Fontgrößen:
setDefaultFontSize()
setTextSize()
– JavaScript: setJavaScriptEnabled()
– UserAgent: setUseDesktopUserAgent()
und
• Einstellungen sind nicht persistent
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
135
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Arten von Ressourcen
Vgl. Folie 43
• (simple) values
• drawables (Zeichnungen)
• layouts
• Animationen
• sonstige XML-Dateien
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
136
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
• Styles
• raw resources (sonstige Dateien)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
137
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Einfache Konstanten (simple values)
Werden definiert in unterschiedlichen XML-Dateien im Verzeichnis
res/values.
Arten:
• Strings
• Farben
• Dimensionen
• Arrays
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
138
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Strings
• res/values/strings.xml
• <?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World</string>
<string name="app_name">Beispiel WebView</string>
</resources>
• Einfache HTML-Textformatierung wird unterstützt durch folgende Tags:
<b>, <i> und <u>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
139
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
• Prinzipiell können solche Strings auch als Formatstring für z. B.
String.format() verwendet werden. Hierbei wird aber keine HTMLTextformatierung unterstützt. Deshalb:
– HTML-Tags kodieren
– Nach Formatierung mit String.format() noch Html.fromHtml()
anwenden.
• Ressource-ID: z.B . R.string.hello
• Zugriff über Activity- bzw. Context-Methoden: getString() und
getText()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
140
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Farben
• res/values/colors.xml
• Muster zur Definition von Farben: #RGB, #RRGGBB, #ARGB, #AARRGGBB
• <color name="opaque_blue">#00F</color>
<color name="transparent_green">#7700FF00</color>
• Ressource-ID: z.B. R.color.opaque blue bzw. @color/opaque blue
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
141
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Dimensionen
• px: Bildschirmpixel
• in: Inches
• pt: Points
• mm: Millimeter
• dp: Dichteunabhängige Pixel bezogen auf einen 160-dpi Bildschirm
• sp: Skalierungsunabhängige Pixel
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
142
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Definitionen üblicherweise in res/values/dimensions.xml:
...
<dimen name="standard_border">5px</dimen>
...
Referenzierung: R.dimen.standard border bzw. @dimen/standard border
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
143
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Arrays
• res/values/arrays.xml
• String-Array mit zwei Elementen:
<string-array name="cursor_forms">
<item>Block Cursor</item>
<item>Outline Cursor</item>
</string-array>
• array vs. string-array?
• Referenzierung: R.array.cursor forms bzw. @array/cursor forms
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
144
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Zugriff auf Ressourcen
• Dynamischer Zugriff auf Ressourcen vom Programm aus: Mit Hilfe einer
Instanz der Klasse Resources
• Context bzw. Activity liefert eine solche Instanz als Ergebnis der Methode
getResources().
Resources myResources = getResources();
• Resources bietet spezifische Methoden um auf die Ressourcen über die
ID zuzugreifen.
int opaqueBlue = myResources.getColor(R.color.opaque_blue);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
145
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
float borderWidth =
myResources.getDimension(R.dimen.standard_border);
String[] cursorForms =
myResources.getStringArray(R.array.cursor_forms);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
146
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
System-Ressourcen
• Android stellt eine Reihe von eingebauten Ressourcen zur Verfügung.
• Im Quelltext erfolgt der Zugriff mit Hilfe der ID android.R...:
String httpError = getString(android.R.string.httpErrorBadUrl);
• Innerhalb von Ressourcen lautet die ID @android:...:
<EditText ...
android:textColor="@android:color/dark_gray"
/>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
147
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Ressourcen für unterschiedliche Sprachen und Hardware
• Lokalisierte Definitionen erfolgen in Verzeichnissen, deren Namen um Sprach- oder
Hardwarekennungen (Qualifiers) erweitert
sind.
• Trennsymbol: Hyphen • siehe Grafik rechts für deutsche Lokalisierung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
148
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Qualifiers
• Sprache: klein ISO 639-1 Sprachcode, z.B. en, de
• Region: r gefolgt von groß ISO 3166-1-alpha-2 Sprachcode, z.B rUS, rGB
• Bildschirmorientierung: Portrait (port) oder Landscape (land)
• Pixeldichte des Bildschirms: in dpi, z.B. 92dpi
• Touchscreen Type: notouch, stylus, finger
• Verfügbarkeit der Tastatur: keysexposed oder keyshidden
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
149
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
• Keyboard Type: nokeys, qwerty oder 12key
• UI Navigation Type: notouch, dpad, trackball, wheel
• Bildschirmauflösung: in Pixeln, größere zuerst, z.B. 320x240
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
150
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Beliebige Kombination der Qualifiers ist möglich, aber genau in obiger
Reihenfolge, jeder Qualifier durch ein Hyphen getrennt und nur ein Wert
für einen Qualifier.
• Gültige Qualifier:
drawable-en-rUS
drawable-land-notouch-nokeys-320x240
• Ungültige Qualifier:
drawable-rUS-en
drawable-rUS-rUK
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
151
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Konfigurationsänderungen zur Laufzeit
• Zum Beispiel das Aufklappen der Tastatur stellt eine Konfigurationsänderung dar: keysexposed statt keyshidden
• Android reagiert auf solche Änderungen simpel: Restart der Applikation
• Um dies zu verhindern, muss die Applikation auf die Änderung reagieren.
Hierzu:
– Eintrag im Manifest
– Überschreiben der Methode onConfigurationChanged()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
152
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Konfigurationsänderungen
• orientation: Wechsel von Portrait nach Landscape
• keyboardHidden: Tastatur wurde auf- oder zugeklappt
• fontScale: Benutzer hat die bevorzugte Fontgröße gändert
• locale: Änderung der Spracheinstellung
• keyboard: Art der Tastatur hat sich geändert
• touchscreen oder navigation: Treten normalerweise nicht auf
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
153
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Konfigurationsänderungen: Manifest
• Eintrag in der zugehörigen Activity notwendig.
• Attribut: android:configChanges
• Arten der Änderung durch | verbinden.
• <activity ...
android:configChanges="orientation|keyboardHidden"/>
• Alle Änderungen, die nicht aufgeführt werden, führen zu einem Restart.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
154
2. GUI-Programmierung für mobile Geräte
Einbindung von Ressourcen
Konfigurationsänderungen: Activity
Überschreiben der Methode onConfigurationChanged():
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if ( newconfig.orientation == Configuration.ORIENTATION_LANDSCAPE ) {
...
}
if ( newconfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO ) {
...
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
155
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Definition eigener Views
Prinzipielle Ansätze:
• Spezialisierung eines Widgets bei Nutzung der vorhandenen Darstellungsmöglichkeiten
z.B. TextView zur formatierten Ausgabe von Fließkommazahlen
• Layoutdefinition (Komposition verschiedener Widgets) als eigene Klasse
z. B. Kombination von TextView mit EditText für Eingabefeld mit
Label
• Definition von Views mit neuen Darstellungsmöglichkeiten
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
156
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Spezialisierung von Widgets
• Ableitung von einem existieren Widget mittels Vererbung
• Konstruktoren übernehmen und super verwenden
• private Methode für spezielle Initialisierungen
• zusätzliche Funktionalität durch zusätzliche Methoden
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
157
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
View-Konstruktoren
Üblicherweise mindestens die folgenden (vgl. android.view.View):
• Widgetklasse(Context context)
Simple constructor to use when creating a view from code.
• Widgetklasse(Context context, AttributeSet attrs)
Constructor that is called when inflating a view from XML.
• Widgetklasse(Context context, AttributeSet attrs, int defStyle)
Perform inflation from XML and apply a class-specific base style.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
158
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Verwendung in Layout-Definitionen
• Spezialisierte Widgets/View können in den XML-Layout-Definitionen
verwendet werden.
• Elementname: Voll qualifizierter Klassenname
• Attribute/Properties der Oberklasse können verwendet werden, insbesondere auch android:id
• Attribut/Properties-Editor bleibt verwendbar
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
159
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<mypackage.MyView android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/myView"/>
<Button .../>
<TextView .../>
</LinearLayout>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
160
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Beispiel: TextView zur Anzeige von Fließkommawerten
Beispiel 2.9. Widget NumberView als Spezialisierung von TextView mit einstellbarer Genauigkeit
Layout mit NumberView zur Anzeige einer
Double-Zufallszahl, einem Button zur Erzeugung einer Zufallszahl und Buttons zur Änderung der Genauigkeit
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
161
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Definition eigener Layout-Klassen
• Ableiten von der gewünschten Layout-Klasse, z.B. LinearLayout
• Zwei Möglichkeiten der Layout-Definition
– Quelltext: einfache Wiederverwendung, umständlichere LayoutDefinition
– XML: einfachere Layout-Definition, erfordert Einsatz eines
LayoutInflater, unhandlichere Wiederverwendung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
162
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Ableiten von einer Layout-Klasse
Konstruktoren z.B. bei LinearLayout:
• LinearLayout(Context context)
• LinearLayout(Context context, AttributeSet attrs)
☞ Für die Wiederverwendung einer selbstdefinierten Layout-Klasse in einer
XML-Layout-Definition unbedingt den zweiten Konstruktor implementieren!
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
163
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Layout-Definition im Quelltext
• Im Konstruktor grundlegende Einstellungen am Layout-Objekt vornehmen, z.B. setOrientation() und setGravity()
• Views, die im Layout enthalten sein sollen erzeugen, evtl. private
Variablen für den Zugriff auf die Views
• Layout-Einstellungen für die Views erzeugen, z.B. mittels
LinearLayout.LayoutParams
• Views dem Layout-Objekt hinzufügen: addView()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
164
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Hinzufügen und Entfernen von Views zu einer ViewGroup
Siehe android.view.ViewGroup:
• public void addView (View child, int index)
Adds a child view. If no layout parameters are already set on the child,
the default parameters for this ViewGroup are set on the child.
• public void addView (View child, int width, int height)
Adds a child view with this ViewGroup’s default layout parameters and
the specified width and height.
• public void addView (View child, ViewGroup.LayoutParams params)
Adds a child view with the specified layout parameters.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
165
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
• public void addView (View child, int index, ViewGroup.LayoutParams
params)
Adds a child view with the specified layout parameters.
• public void addView (View child)
Adds a child view. If no layout parameters are already set on the child,
the default parameters for this ViewGroup are set on the child.
Entfernen von Views aus einer ViewGroup:
• public void removeAllViews ()
Call this method to remove all child views from the ViewGroup.
• public void removeView (View view)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
166
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
• public void removeViewAt (int index)
Removes the view at the specified position in the group.
• public void removeViews (int start, int count)
Removes the specified range of views from the group.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
167
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Layout-Parameter
• Allgemeine Klasse für Layout-Parameter: ViewGroup.LayoutParams
• Parameter hier: width und height, entsprechend den Attributen
layout width und layout height
• Spezialisierte Unterklassen von ViewGroup.LayoutParams für Unterklassen von ViewGroup
• Beispiel: LinearLayout.LayoutParams für LinearLayout
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
168
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
LinearLayout.LayoutParams
• Parameter originär: gravity und weight
• Parameter abgeleitet von ViewGroup.MarginLayoutParams: bottomMargin,
leftMargin, rightMargin und topMargin
• Parameter abgeleitet von ViewGroup.LayoutParams: height, width,
layoutAnimationParameters
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
169
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
XML-basierte Layout-Klassen
• Layout-Definition mit XML in res/layout/meinlayout.xml, Wurzelelement z.B. LinearLayout
• Klasse MeinLayout ableiten von Klasse des Wurzelelementes aus
meinlayout.xml, also z.B. LinearLayout
• Für MeinLayout Konstruktoren implementieren und in den Konstruktoren
ein Layout-Inflating durchführen.
• Wirkungsweise des Layout-Inflating: Die Layout-Definition wird gelesen,
zugehöriger Objektbaum wird angelegt, idealerweise mit aktuellem Objekt
als Wurzel.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
170
2. GUI-Programmierung für mobile Geräte
• Wenn Referenzen
findViewById()
Definition eigener Views
auf
enthaltene
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
Views
erforderlich
sind:
171
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Layout-Inflating
• Referenz auf LayoutInflater ermitteln:
LayoutInflater li = (LayoutInflater)getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
• “Inflating” durchführen:
li.inflate(R.layout.meinlayout, this, true);
• public View inflate(int res, ViewGroup root, boolean attachToRoot)
res: ID for an XML layout resource to load (e.g., R.layout.main page)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
172
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
root: Optional view to be the parent of the generated hierarchy (if
attachToRoot is true), or else simply an object that provides a set of
LayoutParams values for root of the returned hierarchy (if attachToRoot
is false.)
attachToRoot: Whether the inflated hierarchy should be attached to the
root parameter? If false, root is only used to create the correct subclass
of LayoutParams for the root view in the XML.
Returns: The root View of the inflated hierarchy. If root was supplied
and attachToRoot is true, this is root; otherwise it is the root of the
inflated XML file.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
173
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Beispiel: Eigene Layout-Klassen
Beispiel 2.10. Zwei Layout-Klassen, jeweils
bestehend aus fünf horizontal angeordneten
Buttons:
• Layout-Klasse ButtonField nutzt LayoutInflating,
• ButtonField2 definiert das Layout im
Quelltext.
Main-Layout main.xml enthält je eine Instanz
der definierten Layout-Klassen.
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
174
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Definition von Views mit neuen
Darstellungsmögliochkeiten
• Klasse ableiten von android.view.View
• Konstruktoren implementieren und Konstruktoren der Oberklasse aufrufen (vgl. Folie 158)
• Methoden, die überschreiben werden müssen:
– protected void onMeasure (int widthMeasureSpec, int heightMeasureSpe
– protected void onDraw (Canvas canvas)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
175
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Größenberechnung
• Standardgröße für eine View: 100 mal 100 Pixel
• Soll die selbstdefinierte View eine andere Größe haben, muss
onMeasure() überschrieben werden.
• Zweck von onMeasure(): Das die View umgebende Layout-Objekt fragt
bei der Berechnung des Layouts an, wieviel Platz die View im Layout
einnehmen soll.
• Setzen der Größe mittels:
protected final void setMeasuredDimension (int measuredWidth, int measu
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
176
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
• Wenn onMeasure() überschrieben wird, muss stets ein Aufruf von
setMeasuredDimension() erfolgen! Ansonsten: IllegalStateException
• Die Parameter von setMeasuredDimension() müssen zunächst decodiert werden:
int mode = MeasureSpec.getMode(measuredWidth);
int width = MeasureSpec.getSize(measuredWidth);
• Mögliche Werte für mode (siehe View.measureSpec):
– EXACT: Das umgebende Layout-Objekt stellt der View exakt die übergebene Größe bereit.
– AT MOST: Das umgebende Layout-Objekt fragt nach der Größe der
darzustellenden View. Die übergebene Größe ist dabei eine maximale
Größe für die View.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
177
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
– UNSPECIFIED: Das umgebende Layout-Objekt hat keine Restriktionen
für die Größe der View festgelegt.
• Die Grenzen sollten als strikt betrachtet werden. Durch eine geeignete
Layout-Definition kann man dafür sorgen, dass ausreichend Platz zur
Verfügung steht.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
178
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Zeichnen einer View
Die Darstellung einer View erfolgt durch Überschreiben der Methode:
protected void onDraw (Canvas canvas)
• Canvas stellt eine Fläche (Leinwand) dar, auf die die View gezeichnet
werden kann.
• Das Zeichnen geschieht mit Hilfe von Instanzmethoden der Klasse
Canvas.
• Zum Zeichnen benötigen wir meistens ein Paint-Objekt. Dieses beeinflusst die Art der Zeichnung (z.B. die Linienstärke).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
179
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
• Drawables sind Objekte, die direkt auf eine Leinwand platziert werden
können (z.B. Grafiken)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
180
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Methoden zum Zeichnen
Eine Auswahl (siehe android.graphics.Canvas):
• public void drawColor (int color)
public void drawARGB (int a, int r, int g, int b)
public void drawRGB (int r, int g, int b)
Ausfüllen der Leinwand mit einer einzelnen Farbe
• public void drawArc (RectF oval, float startAngle, float sweepAngle,
boolean useCenter, Paint paint)
Zeichnet einen Kreisbogen innerhalb eines Rechtecks.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
181
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
• public void drawBitmap (Bitmap bitmap, float left, float top,
Paint paint)
Zeichnet die Bitmap an die angegebene Stelle.
• public void drawCircle (float cx, float cy, float radius, Paint
paint)
Zeichnet einen Kreis.
• public void drawLine (float startX, float startY, float stopX,
float stopY, Paint paint)
public void drawLines (float[] pts, Paint paint)
Zeichnet eine bzw. mehrere Strecken.
• public void drawOval (RectF oval, Paint paint)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
182
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Zeichnet eine Ellipse.
• public void drawPath (Path path, Paint paint)
Mehrere Primitive in einem Path-Objekt, hier auch quadratische, kubische Splines möglich.
• public void drawRect (float left, float top, float right, float
bottom, Paint paint)
Zeichnet ein Rechteck.
• public void drawRoundRect (RectF rect, float rx, float ry, Paint
paint)
Rechteck mit abgerundeten Ecken
• public void drawText (String text, float x, float y, Paint paint)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
183
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Zeichnet einen String auf die Leinwand.
• public void drawTextOnPath (String text, Path path, float hOffset,
float vOffset, Paint paint)
Zeichnet einen Text entlang eines Path-Objekts
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
184
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Paint
Ein Paint-Objekt legt für das Zeichnen fest:
• Farbe mittels setColor(int color)
Siehe Klasse android.graphics.Color zum Erzeugen von Farben, z.B.
int cyan = Color.rgb(0,255,255);
• Style mittels setStyle(Paint.Style style)
Werte für Paint.Style:
– FILL: Geometry and text drawn with this style will be filled, ignoring
all stroke-related settings in the paint.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
185
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
– FILL AND STROKE: Geometry and text drawn with this style will be
both filled and stroked at the same time, respecting the stroke-related
fields on the paint.
– STROKE: Geometry and text drawn with this style will be stroked,
respecting the stroke-related fields on the paint.
• Font: z.B. setTypeface(Typeface typeface) und setTextSize(float
textSize)
• Effekte: z.B. Antialiasing
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
186
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Sonstiges
• Erzwingen des Neuzeichnens: Methode invalidate() einer View
• Tatsächliche Größe erfragen in onDraw(): getMeasuredHeight() und
getMeasuredWidth()
• Empfehlung: Paint-Objekte nur einmal anlegen
• MVC-Muster verwenden
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
187
2. GUI-Programmierung für mobile Geräte
Definition eigener Views
Beispiel: Bunte Kreise
Beispiel 2.11. Spezialisierte View zur Anzeige einer Menge von bunten Kreisen.
Siehe Homepage
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
188
3. Persistenz und Datenbanken
Lernziele
3. Persistenz und Datenbanken
Themen/Lernziele:
• Einstellungen
• Dateien lesen und schreiben
• Datenbanken mit SQLite
• Allgemeine Schnittstelle zu Datenquellen: Content Provider
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
189
3. Persistenz und Datenbanken
Lernziele
Android Technologien zur persistenten Speicherung
• Shared Preferences: Schlüssel/Wert-Paare
• Files: Schreiben und lesen von Dateien mit der Java-API, Speicherung
intern oder auf Speicherkarte
• SQLite Datenbanken: Jede Anwendung kann ihre eigene SQLite Datenbank verwalten
• Content Provider: Allgemeine Schnittstelle für den Datenzugriff und die
Manipulation über Anwendungsgrenzen hinweg
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
190
3. Persistenz und Datenbanken
Shared Preferences
Speicherung von Schlüssel/Wert-Paaren
Prinzipiell zwei Techniken:
• SharedPreferences: persistente Speicherung der Paare, Zugriff innerhalb des selben Kontextes
• Bundle: Speicherung von Paaren zur Sicherung von Activity-Zuständen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
191
3. Persistenz und Datenbanken
Shared Preferences
Shared Preferences
• Klasse SharedPreferences
• Zugriff über den Kontext mit der Methode getSharedPreferences()
• Parameter: Name für eine Sammlung von Schlüssel/Wert-Paaren, Modus
• Beispiel:
SharedPreferences myPrefs = getSharedPreferences("myPrefs",
Activity.MODE_PRIVATE);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
192
3. Persistenz und Datenbanken
Shared Preferences
• Physische Speicherung in:
/data/data/package /shared prefs/myPrefs.xml
• Lesender Zugriff auf die Paare: getXXX(), wobei XXX für einen Datentyp
steht.
• Beispiele:
boolean
float
int
String
boolPref = myPrefs.getBoolean("booleanPref", false);
lastFloat = myPrefs.getFloat("lastFloat", 0f);
gameLevel = myPrefs.getInt("gameLevel", 1);
email = myPrefs.getString("email", "[email protected]");
• 1. Parameter: Schlüssel, 2. Parameter: Default-Wert
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
193
3. Persistenz und Datenbanken
Shared Preferences
Änderungen von Shared Preferences
• Mittels SharedPreferences.Editor
• Editor mit Methode edit() erzeugen:
SharedPreferences.Editor editor = myPrefs.edit();
• Zur Speicherung: putXXX()
• 1. Parameter: Schlüssel, 2. Parameter: neuer Wert
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
194
3. Persistenz und Datenbanken
Shared Preferences
• Beispiel:
editor.putBoolean("booleanPref", true);
editor.putFloat("lastFloat", 1f);
editor.putInt("gameLevel", 2);
editor.putString("email", "[email protected]");
• Zur Sicherung der Änderungen: commit()
editor.commit();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
195
3. Persistenz und Datenbanken
Shared Preferences
Shared Preferences für Einstellungs-Dialoge
• Layout-Klasse für Einstellungs-Dialog: PreferenceScreen
• Views für Einstellungen: z.B. CheckBoxPreference, ListPreference
• Allgemeine Attribute:
– android:key: Der Schlüssel
– android:title: Titel für die Einstellung (groß)
– android:summary: Erläuterung für die Einstellung (klein, unterhalb
von Titel)
– android:defaultValue: voreingestellter Wert
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
196
3. Persistenz und Datenbanken
Shared Preferences
• Zusätzliche Attribute für ListPreference:
– android:entries: Array (String) der anzuzeigenden Listeneinträge
(Texte, sprachspezifisch)
– android:entryValues: Array mit den Werten zu den Einträgen (sprachunabhängig)
– android:dialogTitle: Titel zur Auswahlliste
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
197
3. Persistenz und Datenbanken
Shared Preferences
<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/andro
<CheckBoxPreference
android:key="entrydialog"
android:title="@string/set_entrydiag_title"
android:summary="@string/set_entrydiag_summary"
android:defaultValue="true"/>
<ListPreference
android:key="cursorform"
android:title="@string/set_cursor_title"
android:summary="@string/set_cursor_summary"
android:entries="@array/cursor_forms"
android:entryValues="@array/cursor_form_values"
android:defaultValue="block"
android:dialogTitle="@string/set_cursor_dialog_title"/>
<ListPreference
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
198
3. Persistenz und Datenbanken
Shared Preferences
android:key="defsqform"
android:title="@string/set_defsquare_title"
android:summary="@string/set_defsquare_summary"
android:entries="@array/defsquare_forms"
android:entryValues="@array/defsquare_form_values"
android:defaultValue="block"
android:dialogTitle="@string/set_defsquare_dialog_title"/>
</PreferenceScreen>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
199
3. Persistenz und Datenbanken
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
Shared Preferences
200
3. Persistenz und Datenbanken
Shared Preferences
Activity für Einstellungs-Dialoge
• PreferenceActivity als Unterklasse von Activity
• Üblicherweise bildet man wiederum Unterklasse von PreferenceActivity
• Import des Einstellungs-Layout in onCreate() mittels
addPreferencesFromResource()
• Gute Vorgehensweise: Für jede Einstellung eine Klassenmethode für die
Abfrage anbieten, evtl. auch für Änderung
• Zugriff auf SharedPreferences mit Hilfe des PreferenceManager
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
201
3. Persistenz und Datenbanken
Shared Preferences
• Beispiel lesen:
public static boolean getEntryDialog(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).
getBoolean(ENTRY_DIALOG_KEY, ENTRY_DIALOG_DEFAULT);
}
• Beispiel schreiben:
public static void putEntryDialog(Context context, boolean value) {
SharedPreferences.Editor editor = PreferenceManager.
getDefaultSharedPreferences(context).edit();
editor.putBoolean(ENTRY_DIALOG_KEY, value);
editor.commit();
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
202
3. Persistenz und Datenbanken
Shared Preferences
• Zum Starten der PreferenceActivity:
public void onShowSettings() {
startActivity(new Intent(this,SettingsLayout.class));
}
SettingsLayout ist hier von PreferenceActivity abgeleitet.
• Nicht vergessen: Manifest erweitern!
<activity android:name=".SettingsLayout" android:label="Settings">
</activity>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
203
3. Persistenz und Datenbanken
Lesen und Schreiben von Dateien
Statische Dateien als Ressourcen
• Dateien in Verzeichnis res/raw/ ablegen, z.B. res/raw/meineDatei
• Es wird automatisch erzeugt: R.raw.meineDatei
• Zugriff über Resources und die Methode openRawResource():
Resources res = getResources();
InputStream meineDatei = res.openRawResource(R.raw.meineDatei);
• nur lesender Zugriff
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
204
3. Persistenz und Datenbanken
Lesen und Schreiben von Dateien
Zugriff auf Dateien
• FileOutputStream oder FileInputStream erzeugen mit openFileOutput()
oder openFileInput()
• Beispiel:
FileOutputStream fos = openFileOutput("myFile.txt", 0);
FileInputStream fis = openFileInput("myOtherFile.txt");
• Pfadnamen nur relativ möglich! Ansonsten Exception
• Bei openFileOutput() wird Datei automatisch neu angelegt oder überschrieben.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
205
3. Persistenz und Datenbanken
Lesen und Schreiben von Dateien
• Anhängen: Context.MODE APPEND beim zweiten Parameter
• Physische Ablage in Verzeichnis /data/data/package /lib
• Kein Sharing zwischen Anwendungen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
206
3. Persistenz und Datenbanken
Lesen und Schreiben von Dateien
Datei-Management
siehe android.content.Context, Beispiele:
• fileList() liefert ein String-Array mit Dateinamen zur Anwendung
• deleteFile(): Löschen von Dateien
• getFilesDir(): Liefert den Pfad, in dem die Dateien der Anwendung
abgelegt werden
java.io.File:
• exists(): Prüft, ob eine Datei existiert
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
207
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Datenbanken mit SQLite
• Open Source
• weitgehend konform zum Standard SQL-92
• leichtgewichtig
• Einbindung über C-Bibliothek
• Weitere Informationen: www.sqlite.org
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
208
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Manifest Typing
In manifest typing, the datatype is a property of the value itself, not
of the column in which the value is stored. SQLite thus allows the
user to store any value of any datatype into any column regardless of
the declared type of that column.
☞ Die Angabe der Datentypen bei create table sind nur ein Hinweis an
die Datenbank, sie müssen nicht eingehalten werden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
209
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Keine Unterstützung von ...
• Java Database Connectivity (JDBC)
• referentielle Integrität (foreign key)
• bestimmte Join-Arten wie right outer join und full outer join
• bestimmte Arten von alter table Anweisungen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
210
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Anlegen/Öffnen einer Datenbank
• üblicherweise mittels
SQLiteOpenHelper
einer
Instanz
einer
Unterklasse
von
• Konstruktorparameter von SQLiteOpenHelper:
–
–
–
–
Context, z.B. die Activity
Name der Datenbank
Instanz einer Cursor-Factory, wenn nicht notwendig == null
Versionsnummer der Datenbank
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
211
3. Persistenz und Datenbanken
Datenbanken mit SQLite
• In Unterklasse überschreibt man die folgenden Methoden von
SQLiteOpenHelper:
– public void onCreate(SQLiteDatabase db)
Wird aufgerufen, wenn die Datenbank bisher nicht existiert. Enthält
typischerweise Anweisungen zum Erzeugen der Datenbank-Relationen.
– public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion)
Wird aufgerufen, wenn beim Öffnen der Datenbank eine höhere Versionsnummer angegeben wird, als beim letzten Öffnen. Enthält Anweisungen zum Upgrade der Datenbank auf newVersion.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
212
3. Persistenz und Datenbanken
Datenbanken mit SQLite
• Methoden von SQLiteOpenHelper zum Anlegen/Öffnen einer Datenbank:
– public SQLiteDatabase getWriteableDatabase()
Create and/or open a database that will be used for reading and
writing.
– public SQLiteDatabase getReadableDatabase()
Create and/or open a database.
• Ohne Nutzung von SQLiteOpenHelper: Mittels der Methode
public SQLiteDatabase openOrCreateDatabase(String name, int
mode, SQLiteDatabase.CursorFactory factory)
auf Context-Objekt
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
213
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Methoden für SQLiteDatabase
Einige Methoden zur Verwaltung und Transaktionssteuerung:
• void close()
• void beginTransaction()
• void endTransaction()
• int getVersion()
• boolean isOpen()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
214
3. Persistenz und Datenbanken
Datenbanken mit SQLite
DDL-Anweisungen
• SQL-Anweisungen, die keine Anfragen sind, können stets mittels
public void execSQL(String sql)
ausgeführt werden.
• z. B. create table, insert, etc.
• Keine Unterstützung mehrerer Anweisungen!
• Ungültige SQL-Anweisungen lösen eine SQLException aus.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
215
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Anfragen
Möglichkeiten zur Durchführung von Anfragen:
• Raw Queries
• Regular Queries
• mit Hilfe eines SQLiteQueryBuilder
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
216
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Raw Queries
• public Cursor rawQuery (String sql, String[] selectionArgs)
• SQL-Anfrage: sql
• falls sql Anfrage vollständig qualifiziert, dann ist selectionArgs ==
null
• sql kann in WHERE-Klausel “?” als Platzhalter für Parameter enthalten
dann Übergabe der Parameterwerte mit Hilfe von selectionArgs
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
217
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Regular Queries
public Cursor query (boolean distinct,
String table, String[] columns,
String selection, String[] selectionArgs,
String groupBy, String having,
String orderBy, String limit)
• distinct: Duplikatelimination oder nicht
• table: Relationenname
• columns: Spaltennamen für die Projektion
• selection: Tupelbedingung, kann “?” als Platzhalter enthalten
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
218
3. Persistenz und Datenbanken
Datenbanken mit SQLite
• selectionArgs: Parameter für die Platzhalter in selection
• groupBy: Spaltennamen für die Gruppierung
• having: Gruppenbedingung
• orderBy: Festlegung der Reihenfolge der Tupel
• limit: Maximale Anzahl an Tupeln, die die Anfrage liefern soll
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
219
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Cursor
• Query liefert eine Cursor-Instanz
• Ein Cursor ist ein Fenster auf das Ergebnis einer Anfrage: jeweils ein
Tupel ist das aktuelle Tupel
• Cursor stellt Methoden zur Navigation innerhalb des Ergebnisses bereit
• Weiterhin Methoden für den Zugriff auf die Werte des aktuellen Tupels
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
220
3. Persistenz und Datenbanken
Datenbanken mit SQLite
Cursormethoden
• public boolean moveToFirst()
Setzt den Cursor auf das erste Tupel der Ergebnismenge.
• public boolean moveToNext()
Setzt den Cursor auf das nächste Tupel der Ergebnismenge.
• public boolean moveToPrevious()
Setzt den Cursor auf das vorhergehende Tupel der Ergebnismenge.
• public int getCount()
Liefert die Anzahl der Tupel in der Ergebnismenge.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
221
3. Persistenz und Datenbanken
Datenbanken mit SQLite
• public int getColumnIndex(String colName)
Liefert den Spaltenindex zu einem Spaltennamen.
• public String getColumnName(int colIndex)
Liefert den Spaltennamen zu einem Spaltenindex.
• public String[] getColumnNames()
Liefert ein Feld der Spaltennamen.
• Für die Ermittlung der Werte stehen Getter-Methoden in Abhängigkeit
vom Datentyp zur Verfügung:
public Datentyp getDatentyp (int spaltenIndex)
Datentypen: int, long, short, double, float, String
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
222
3. Persistenz und Datenbanken
Datenbanken mit SQLite
• public void close()
Schließen des Cursors.
• Mit Hilfe der Methoden deactivate() und requery() kann ein Cursor
vorübergehend deaktiviert und anschließend wieder aktualisiert werden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
223
3. Persistenz und Datenbanken
Datenbanken mit SQLite
DML-Anweisungen
• DML: Data Manipulation Language
• Insert, Update, Delete
• Immer möglich mittels execSQL()
• Nachteil: Komplette SQL-Anweisung muss als String aufgebaut werden.
• Alternative: ContentValues
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
224
3. Persistenz und Datenbanken
Datenbanken mit SQLite
ContentValues
• Dient eigentlich zur Speicherung von Werten, die ein ContentResolver
verarbeiten kann.
• Auch für SQLite-Datenbanken einsetzbar.
• Schema zum Einfügen eines neuen Tupels:
ContentValues tupel = new ContentValues();
tupel.put(Spalten-Name , Wert );
...
db.insert(Tabellen-Name , null, tupel);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
225
3. Persistenz und Datenbanken
Datenbanken mit SQLite
• Update mit Hilfe von:
db.update(Tabellen-Name, tupel, where, null)
where: Selektionsbedingung analog zur WHERE-Klausel, um die zu ändernden Tupel zu bestimmen.
• Delete analog mit:
db.delete(Tabellen-Name, where, null)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
226
3. Persistenz und Datenbanken
Content Providers
Content Providers
• Generische Schnittstelle zum Zugriff auf Daten zwischen Anwendungen
• Entkopplung der Daten-Schicht von der Anwendungsschicht
• Zugriff erfolgt URI-basiert
• Kontrolle der Zugriffsrechte
• eingebaute Datenquellen (z.B. Kontakte) sind Content Provider
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
227
3. Persistenz und Datenbanken
Content Providers
Nutzung eines Content Provider
• Zugriff durch Instanz von ContentResolver
• Resolver erhältlich über den Anwendungskontext:
ContentResolver cr = getContentResolver();
• Der Provider wird durch eine URI angegeben, die der Provider selbst
festlegt.
• siehe Paket android.provider, zugehörige Klassen und Konstanten
CONTENT URI
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
228
3. Persistenz und Datenbanken
Content Providers
Content URIs
Typischerweise zwei Arten:
• URI für alle Datensätze (Tupel)
• URI für einen einzelnen Datensatz, üblicherweise gebildet durch Anhängen
von /tupelID an die URI für alle Datensätze
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
229
3. Persistenz und Datenbanken
Content Providers
Anfragen
• Resultat als Cursor
• Anfragemethode: query()
• Parameter:
– URI des Content Provider (Uri)
– Projektion auf bestimmte Spalten/Attribute (String[])
– Bedingung an die Ergebnismenge entsprechend einer WHERE-Klausel,
kann “?” als Platzhalter enthalten (String)
– Parameter für die Platzhalter in der WHERE-Bedingung (String[])
– Reihenfolge der Datensätze (String)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
230
3. Persistenz und Datenbanken
Content Providers
Alle Datensätze:
Cursor allRows = getContentResolver().query(MyProvider.CONTENT URI,
null, null, null, null);
Alle Datensätze, deren 3. Spalte mit einem erforderlichen Wert übereinstimmt und Sortierung der Ergebnismenge nach der 5. Spalte:
String where = KEY COL3 + "=" + requiredValue;
String order = KEY COL5;
Cursor someRows = getContentResolver().query(MyProvider.CONTENT URI,
null, where, null, order);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
231
3. Persistenz und Datenbanken
Content Providers
Insert
• Datensätze werden repräsentiert als Instanzen von ContentValues
• Einfügen eines einzelnen Datensatzes: insert()
Parameter: URI, ContentValues-Instanz
Ergebnis: URI für den eingefügten Datensatz
• Einfügen mehrerer Datensätze: bulkInsert()
Parameter: URI, Feld von ContentValues
Ergebnis: Anzahl der eingefügten Datensätze
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
232
3. Persistenz und Datenbanken
Content Providers
Einzelnen Datensatz einfügen:
ContentValues row = new ContentValues();
row.put(COLUMN NAME, value);
...
Uri rowUri = getContentResolver().insert(MyProvider.CONTENT URI, row);
Mehrere Datensätze einfügen:
ContentValues[] rows = new ContentValues[n];
for (int i=0 ; i<n ; i++) {
rows[i] = new ContentValues();
rows[i].put(COLUMN NAME, value);
...
}
int count = getContentResolver().bulkInsert(MyProvider.CONTENT URI, rows)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
233
3. Persistenz und Datenbanken
Content Providers
Delete
• Einzelnen Datensatz löschen mit Hilfe der URI des Datensatzes:
getContentResolver().delete(rowURI, null, null);
• Mehrere Datensätze löschen mit URI des Content Provider und optionaler
WHERE-Klausel:
String where = "id < 5";
getContentResolver().delete(MyProvider.CONTENT URI, where, null);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
234
3. Persistenz und Datenbanken
Content Providers
Update
• ContentValues-Instanz:
ContentValues row = new ContentValues();
row.put(COLUMN NAME, value); ...
• WHERE-Klausel:
String where = "id < 5";
• Durchführung:
getContentResolver().update(MyProvider.CONTENT URI, value, where, null)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
235
3. Persistenz und Datenbanken
Content Providers
Dateien im Content Provider
• Werden als URIs repräsentiert, internes Mapping zwischen URI und Datei
• Methoden openOuputStream() bzw. openInputStream() um Daten zu
schreiben bzw. zu lesen
• Beispiel:
Uri uri = getContentResolver().insert(MyProvider.CONTENT URI, value);
try {
OutputStream = getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, outStream);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
236
3. Persistenz und Datenbanken
Content Providers
}
catch (FileNotFoundException e) { }
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
237
3. Persistenz und Datenbanken
Content Providers
Native Android Content Providers
• Alle in Android “eingebauten” Content Provider können mit den dargestellten Techniken genutzt werden.
• Evtl. einfachere Nutzung mit den Klassen im Paket android.provider
Einige Android Content Provider:
• Browser: Zugriff auf Bookmarks, History und gespeicherte Suchanfragen
• CallLog: Zugriff auf Anruflisten
• Contacts: Zugriff auf Kontakte
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
238
3. Persistenz und Datenbanken
Content Providers
• MediaStore: Zentraler Zugriff auf alle Multimedia-Daten des Gerätes
• Settings: Zugriff auf die Einstellungen des Gerätes
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
239
3. Persistenz und Datenbanken
Content Providers
Beispiel: Contacts
// Get a cursor over every contact.
Cursor cursor = getContentResolver().query(People.CONTENT_URI,
null, null, null, null);
// Let the activity manage the cursor lifecycle.
startManagingCursor(cursor);
// Use the convenience properties to get the index of the columns.
int nameIdx = cursor.getColumnIndexOrThrow(People.NAME);
int phoneIdx = cursor.getColumnIndexOrThrow(People.NUMBER);
String[] result = new String[cursor.getCount()];
boolean rowAvail = cursor.moveToFirst();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
240
3. Persistenz und Datenbanken
Content Providers
while ( rowAvail ) {
// Extract the name.
String name = cursor.getString(nameIdx);
// Extract the phone number.
String phone = cursor.getString(phoneIdx);
result[cursor.getPosition()] = name + " (" + phone + ")";
rowAvail = cursor.moveToNext();
}
☞ Damit dieses Beispiel ausgeführt werden kann, muss die READ CONTACTS
Permission dem Manifest hinzugefügt werden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
241
3. Persistenz und Datenbanken
Content Providers
Definition eines Content Provider
• Ableiten von der abstrakten Klasse ContentProvider
• Überschreiben der Methode onCreate(): Hier wird die Datenquelle
erzeugt bzw. geöffnet.
• CONTENT URI breitstellen als Uri-Konstante
• Überschreiben der Zugriffsmethoden: query(), insert(), update(),
delete()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
242
3. Persistenz und Datenbanken
Content Providers
Content Provider URI
• Allgemeine Form einer Content Provider URI:
content://TLD.Firmenname.provider.Anwendung /Datenpfad
Beispiel:
content://de.mobisports.provider.quadroid/items
• Weitere Form für einen bestimmten Datensatz, typischerweise durch
Anhängen einer Datensatznummer:
context://de.mobisports.provider.quadroid/items/4711
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
243
3. Persistenz und Datenbanken
Content Providers
URI-Matching
• Einfachere Analyse von Content-URIs mit einem UriMatcher
• Definition der CONTENT URI:
private static final String myURI =
"content://de.mobisports.provider.quadroid/items";
public static final Uri CONTENT_URI = Uri.parse(myURI);
• Definition von Konstanten zur Unterscheidung der URI-Arten:
private static final int ALLROWS = 1;
private static final int SINGLE_ROW = 2;
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
244
3. Persistenz und Datenbanken
Content Providers
• Deklaration des UriMatcher:
private static final UriMatcher uriMatcher;
• Erzeugung des UriMatcher und Zuordnung der URIs:
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("de.mobisports.provider.quadroid", "items", ALLROW
uriMatcher.addURI("de.mobisports.provider.quadroid", "items/#", SING
}
• Nutzung:
@Override
public Cursor query(Uri uri, String[] projection,
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
245
3. Persistenz und Datenbanken
Content Providers
String selection, String[] selectionArgs,
String sort) {
switch ( uriMatcher.match(uri) ) {
case SINGLE_ROW : ...
break;
case ALLROWS : ...
break;
}
...
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
246
3. Persistenz und Datenbanken
Content Providers
MIME Type
Für die Daten eines Content Provider sollten MIME Types nach folgendem
Schema definiert werden:
• einzelner Datensatz:
vnd.Firmenname.cursor.item/Content-Type
• Menge von Datensätzen:
vnd.Firmenname.cursor.dir/Content-Type
• In der Content Provider Klasse ist hierzu die Methode getType() zu
überschreiben:
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
247
3. Persistenz und Datenbanken
Content Providers
@Override
public String getType(Uri uri) {
switch ( uriMatcher.match(uri) ) {
case SINGLE_ROW :
return "vnd.mobisports.cursor.item/mycontent";
case ALLROWS :
return "vnd.mobisports.cursor.dir/mycontent";
default : throw new IllegalArgumentException("Unsupported URI: " +
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
248
3. Persistenz und Datenbanken
Content Providers
Registrierung des Content Provider
• Der Content Provider muss im Manifest registriert werden!
• Beispiel:
<provider android:name="Myprovider"
android:authorities="de.mobisports.provider.quadroid"/>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
249
4. Software-Kompponenten in Android
Lernziele
4. Software-Komponenten in Android
Themen/Lernziele
• Intents: Explizite und implizite Intents
• Intent-Filter
• Intent-Resolution
• Sub-Activities
• Broadcast Intents und Broadcast Receivers
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
250
4. Software-Kompponenten in Android
Komponenten allgemein
Software-Komponenten
Eine Software-Komponente ist ein Software-Element,
• das konform zu einem Komponentenmodell ist und
• gemäß einem Composition Standard ohne Änderungen mit anderen Komponenten verknüpft und ausgeführt werden kann.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
251
4. Software-Kompponenten in Android
Komponenten allgemein
Komponentenmodell
Ein Komponentenmodell legt einen Rahmen für die Entwicklung und
Ausführung von Komponenten fest,
• der strukturelle Anforderungen hinsichtlich Verknüpfungs- bzw. Kompositionsmöglichkeiten sowie verhaltensorientierte Anforderungen hinsichtlich
Kollaborationsmöglichkeiten an die Komponenten stellt.
• Darüber hinaus wird durch ein Komponentenmodell eine Infrastruktur
angeboten, die häufig benötigte Mechanismen wie Verteilung, Persistenz, Nachrichtenaustausch, Sicherheit und Versionierung implementieren kann.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
252
4. Software-Kompponenten in Android
Komponenten allgemein
Beispiele für Komponentenmodelle
• Enterprise JavaBeans (EJB)
• Component Object Model (COM)
• CORBA Component Model (CCM)
• OSGi (Open Services Gateway initiative)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
253
4. Software-Kompponenten in Android
Komponenten allgemein
Komponenten in Android
• Android definiert ein einfaches Komponentenmodell.
• Komponenten: Activities, Content Provider, Broadcast Receivers, Services
• Verbindung der Komponenten untereinander: Intents
• Lose Kopplung der Komponenten durch implizite Intents
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
254
4. Software-Kompponenten in Android
Intents
Intents
• Intents sind der Kitt zwischen den Komponenten.
• Nutzung von Komponenten durch andere Anwendungen
• Einfacher Austausch von Komponenten
• Lose Kopplung, kein expliziter Aufruf erforderlich
• Integration in das Berechtigungssystem
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
255
4. Software-Kompponenten in Android
Intents
Arten von Intents
• Explizite Intents
Die Empfängerkomponente ist beim Aufruf bekannt und eindeutig identifiziert.
• Implizite Intents
Es bleibt den Komponenten überlassen, auf den Intent zu reagieren.
Auflösung durch das Android Laufzeitsystem.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
256
4. Software-Kompponenten in Android
Intents
Explizite Intents
• Die Empfängerkomponente wird explizit durch Klassenreferenz oder Klassenname angegeben.
Intent intent = new Intent(this, Empfaenger.class);
• Konstruktorparameter: Context, Zielkomponente
• Alternative:
Intent intent = new Intent();
intent.setComponent(new ComponentName(
"domain.applikation.paket",
"Empfaenger"));
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
257
4. Software-Kompponenten in Android
Intents
• Nachteil der zweiten Variante: Prüfung auf die Existenz des Ziels kann
nicht vom Compiler übernommen werden.
• Die im Intent angegebene Activity starten:
startActivity(intent);
Hiermit erfolgt keine Benachrichtigung über Terminierung der gestarteten
Activity.
• Alternative: startActivityForResult()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
258
4. Software-Kompponenten in Android
Intents
Implizite Intents
• Werden praktisch “ins Leere” abgeschickt, in der Hoffung, dass mindestens eine Komponente reagiert.
• Nutzung von Komponenten anderer Anwendungen
• Beispiel: Aufruf des Dialers:
Intent intent = new Intent(Intent.ACTION DIAL,
Uri.parse("tel:(02241)865242"));
startActivity(intent);
• Intent-Bezeichner: hier ACTION DIAL
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
259
4. Software-Kompponenten in Android
Intents
• Es existieren eine Reihe von vordefinierten Intent-Bezeichnern (20 für
“Activity Actions” und 14 für “Broadcast Actions”), definiert als StringKonstante in android.content.Intent.
• Die Definition eigener Intent-Bezeichner ist möglich.
• Eine Komponente legt selbst fest, auf welche Intents sie reagiert (IntentFilter).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
260
4. Software-Kompponenten in Android
Intent-Filter
Intent-Filter
• für implizite Intents
• Filter werden im Manifest deklariert!
• Entwicklungsumgebung erzeugt automatisch einen Intent-Filter für die
Start-Activity:
<activity android:name=".ActivityB1"
android:label="@string/app name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
261
4. Software-Kompponenten in Android
Intent-Filter
Elemente eines Intent-Filters
• action
Bezeichnet die auszuführende Aktion, muss eindeutige Zeichenkette sein,
z.B. auf Basis der Konvention für Paketnamen.
vordefinierte generische Action-Intents in android.content.Intent
Verzeichnis von Intents: www.openintents.org
• category
Legt fest, unter welchen Bedingungen auf den Intent reagiert wird.
DEFAULT: Activity wird als Standard-Activity für den ausgelösten Intent
präsentiert.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
262
4. Software-Kompponenten in Android
Intent-Filter
ALTERNATIVE: Activity wird als weitere Auswahlmöglichkeit neben der
DEFAULT-Activity angeboten.
LAUNCHER: Activity wird im Launcher angeboten.
HOME: Activity wird nach dem Bootvorgang gestartet (Alternativer HomeBildschirm).
In android.content.Intent sind zwölf Categories vordefiniert.
• data
Schränkt die Verwendung einer Activity auf Basis der im Intent enthaltenen URI ein.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
263
4. Software-Kompponenten in Android
Intent-Filter
Intent-Filter: data
Attribute des data-Elements:
• android:scheme
Schema für den Zugriff, z.B. http oder tel
• android:mimetype
Mime-Type, selbstdefinierter oder bekannter, Wildcard (*) verwendbar
• android:host
Angabe eines Hostnamens
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
264
4. Software-Kompponenten in Android
Intent-Filter
• android:path
Setzt android:host voraus, gibt den Pfad zu möglichen Daten an,
andere Attribute: android:pathPrefix android:pathPattern
• android:port
Portnummer, setzt android:host voraus
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
265
4. Software-Kompponenten in Android
Intent-Filter
Intent: Beispiele
• Implizites Starten von Google-Maps:
Uri uri = Uri.parse("geo:50.780100,7.182477");
Intent intent = new Intent(Intent.ACTION VIEW);
intent.setData(uri);
startActivity(intent);
• Implizites Starten des Browsers:
Uri uri = Uri.parse("http://www.h-brs.de");
Intent intent = new Intent(Intent.ACTION VIEW, uri);
startActivity(intent);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
266
4. Software-Kompponenten in Android
Intent-Filter
• Falls keine passende Komponente gefunden wird: ActivityNotFoundException,
aber nicht in der Anwendung, sondern innerhalb des Package Managers
(Android-Plattform)
• Prüfen, ob passende Zielkomponente existiert:
private boolean existsIntentReceiver(Intent intent) {
final PackageManager pm = this.getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
267
4. Software-Kompponenten in Android
Intent-Filter
Intent: zusätzliche Nutzdaten
• Mit der Methode putExtra() können wir zusätzliche Nutzdaten in einem
Intent hinterlegen.
• Beispiel:
Uri uri = Uri.parse("content://de.meineanwendung");
Intent intent = new Intent(Intent.ACTION PICK, uri);
intent.putExtra("DatensatzID", 4711);
startActivity(intent);
• Die Methode putExtra() steht für viele Datentypen zur Verfügung
(auch Feld-Typen).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
268
4. Software-Kompponenten in Android
Intent-Filter
• Zugriff auf Empfängerseite mit getXXX()-Methoden
• putExtras() und getExtras() für Bundle, d.h. Menge von
Schlüssel/Wert-Paaren
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
269
4. Software-Kompponenten in Android
Intent-Filter
Intents empfangen
• In onCreate(): Uri, Data und zusätzliche Nutzdaten analysieren
• Beispiel für Zugriff auf Nutzdaten:
Intent intent = getIntent();
int id = intent.getIntExtra("DatensatzID", 0);
Uri uri = intent.getData();
• Anschließend erforderliche Aktion ausführen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
270
4. Software-Kompponenten in Android
Intent-Filter
Intent-Resolution
• Intent-Resolution ist der Prozess, den Android durchführt, um implizite
Intents aufzulösen.
• Es soll die beste Komponente gefunden werden, die passt.
• Diese wird dann gestartet.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
271
4. Software-Kompponenten in Android
Intent-Filter
Regeln zur Intent-Resolution
Regeln: Es sei L die Liste aller Komponenten mit Intent-Filter.
Regel 1: Komponenten, die mindestens ein Action-Element haben und bei
denen keins dieser Elemente passt, werden aus L gelöscht.
Regel 2: Komponenten, die kein passendes Category-Element zu einem
Catagory-Element des Intents haben, werden aus L gelöscht.
Regel 3: Komponenten, die kein passendes Data-Element zur URI des
Intent haben, werden aus L gelöscht.
Regel 4: Werden mehrere Komponenten mit passendem Intent-Filter gefunden, präsentiert Android einen Auswahlbildschirm.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
272
4. Software-Kompponenten in Android
Sub-Activities
Sub-Activities
• Normale Activity, die im Manifest deklariert wird,
• die aber von einer anderen Activity aus gestartet wird.
• Verbindung zur startenden Activity
• Callback-Mechanismus zur Rückgabe von Daten an die startende Activity
• Typischer Einsatzzweck: Master-Detail-Szenario
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
273
4. Software-Kompponenten in Android
Sub-Activities
• Start mit Hilfe von startActivityForResult():
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION EDIT, uri);
int requestCode = 4711;
startActivityForResult(intent, requestCode);
• Nach Beendigung der Sub-Activity in der startenden Activity:
onActivityResult():
public void onActivityResult(int requestCode,
int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
274
4. Software-Kompponenten in Android
Sub-Activities
switch ( resultCode ) {
case Activity.RESULT_OK :
Uri uri = data.getData();
// Verarbeite geaenderten Datensatz
break;
case Activity.RESULT_CANCELED :
break;
...
}
}
• In der Sub-Activity: Vor Beendigung setzen des Resultats mit Hilfe von
setResult():
setResult(resultCode, intent);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
275
4. Software-Kompponenten in Android
Sub-Activities
Der Intent benötigt hier kein Ziel, sondern dient nur der Übergabe von
Daten.
• Beendigung der Sub-Activity durch finish()
• Beispiel: OnClickListener zum Beenden innnerhalb der Sub-Activity:
public void onClick(View view) {
Bundle resultBundle = new Bundle();
resultBundle.putString("id", "datensatz0815");
Intent intent = new Intent();
intent.putExtras(resultBundle);
setResult(RESULT_OK, intent);
finish();
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
276
4. Software-Kompponenten in Android
Sub-Activities
Beispiel: Impliziter Intent für Google Maps
Beispiel 4.1. Mit Hilfe eines impliziten Intents wird Google Maps gestartet, die Karte
ist dabei zentriert auf eine benutzerdefinierte
Position.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
277
4. Software-Kompponenten in Android
Sub-Activities
Beispiel: Expliziter und impliziter Intent innerhalb
Applikation
Beispiel 4.2. Mit Hilfe eines expliziten oder
eines impliziten Intents wird eine andere Komponente (Activity) der gleichen Anwendung
gestartet.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
278
4. Software-Kompponenten in Android
Sub-Activities
Beispiel: impliziter Intent applikationsübergreifend
Beispiel 4.3. Mit Hilfe eines impliziten Intents wird eine andere Komponente (Activity)
einer anderen Anwendung gestartet.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
279
4. Software-Kompponenten in Android
Sub-Activities
Beispiel: Sub-Activity
Beispiel 4.4. In einer Sub-Activity wird
durch Knopfdruck ein Resultat bestimmt, das
in der Main-Activity angezeigt wird.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
280
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Broadcast Intents
• Broadcast Intents sind eine spezielle Art von Intents, die auf Betriebssystemebene (genauer: Application Framework) verschickt werden, nicht
auf der Anwendungsebene
• Zweck: informieren von Anwendungen über Systemereignisse
• Unterscheidung der Intent-Arten in der API-Dokumentation: Broadcast
Action vs. Activity Action
• Broadcast Intents können nicht durch Intent-Filter von Activities gefangen und verarbeitet werden!
• Stattdessen: Broadcast Receiver mit Intent-Filter
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
281
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Einige Broadcast Intents
Broadcast Intent
ACTION BOOT COMPLETED
ACTION BATTERY LOW
ACTION PACKAGE ADDED
ACTION SCREEN OFF
Beschreibung
Boot-Sequenz nach Neustart abgeschlossen
Akku des Gerätes ist fast leer
Neue Anwendung wurde installiert
Bildschirm schaltet sich ab
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
282
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Broadcast Receiver
• android.content.BroadcastReceiver
• Statischer Broadcast Receiver
Wird wie eine Activity im Manifest deklariert.
Broadcast Receiver wird zum Zeitpunkt der Installation in der AndroidPlattform registriert.
Jeder passende Broadcast Intent startet den Broadcast Receiver automatisch.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
283
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
• Dynamischer Broadcast Receiver
Implementierung in einer Activity (oder einem Hintergrundprozess (Service))
Reaktion auf Broadcast Intents während der Visible Lifetime
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
284
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Statischer Broadcast Receiver
• Klasse ableiten von BroadcastReceiver
• Zentrale Methode onReceive() überschreiben
public class SystemStartReceiver extends BroadcastReceiver {
public static final String MEIN_INTENT =
"de.mydomain.myapp.MEIN_INTENT";
@Override
public void onReceive(Context context, Intent intent) {
Intent newIntent = new Intent(MEIN_INTENT, intent.getData());
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
285
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
context.startActivity(newIntent);
}
}
• Keine expliziten Intents innerhalb von onReceive()!
• Setzen des Flags, damit der Activity Manager einen UI-Thread erzeugt.
• Deklarationen im Manifest erforderlich:
– uses-permission für RECEIVE BOOT COMPLETED
– activity mit intent-filter für MEIN INTENT
– receiver mit intent-filter für ACTION BOOT COMPLETED
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
286
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
• <receiver android:name=".SystemStartReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
• Keine Threads in onReceive() starten! Stattdessen Services verwenden.
• onReceive() muss innerhalb von 10 Sekunden beendet sein, sonst wird
ein ANR (Application not Responding) ausgelöst.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
287
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Dynamischer Broadcast Receiver
Registrierung und Abmeldung des Broadcast Receivers:
• zur Laufzeit statt bei der Installation
• jederzeit möglich
• durch Methodenaufrufe statt Eintrag im Manifest
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
288
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Implementierung: Dynamischer Broadcast Receiver
• Klasse ableiten von BroadcastReceiver
• Methode onReceive() überschreiben
• Intent-Filter erzeugen
• Typischerweise in onResume(): Receiver-Instanz erzeugen und mittels
registerReceiver() die Instanz mit Intent-Filter registrieren
• Typischerweise in onPause(): Receiver mittels unregisterReceiver()
abmelden
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
289
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
Beispiel: Dynamischer Broadcast Receiver
Receiver-Klasse:
public class EnergiekrisenReceiver extends BroadcastReceiver {
private Activity activity;
public EnergiekrisenReceiver(Activity activity) {
this.activity = activity;
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(activity, "Akku fast leer!", Toast.LENGTH_SHORT)
.show();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
290
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
}
}
Intent-Filter erzeugen:
public class MyActivity extends Activity {
...
private static final IntentFilter intentFilter =
new IntentFilter("android.intent.action.BATTERY_LOW");
....
}
Methode onResume() der Activity:
@Override
protected void onResume() {
super.onResume();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
291
4. Software-Kompponenten in Android
Broadcast Intents und Broadcast Receivers
this.receiver = new EnergiekrisenReceiver(this);
this.registerReceiver(this.receiver, MyActivity.intentFilter);
}
Methode onPause() der Activity:
@Override
protected void onResume() {
super.onPause();
this.unregisterReceiver(this.receiver);
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
292
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
5. Threads, Serverprozesse und Benachrichtigungen
• Threads allgemein
• Threads in Android: Handler und Messages
• Services: Local, Remote, Binding
• Benachrichtigungen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
293
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Thread
Ein Thread ist eine Folge von Anweisungen, die unabhängig von anderen
Threads parallel zu diesen ausgeführt wird.
• Jeder Thread hat seinen eigenen Stack um lokale Variablen anzulegen
und Methoden aufzurufen.
• Alle Threads eines Prozesses teilen sich den Adressbereich des Prozesses
(keine Interprozesskommunikation notwendig).
• Man nennt Threads auch leichtgewichtige Prozesse.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
294
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Sequentielle Abarbeitung (1)
Wir erzeugen zwei gleichartige Objekte der Klasse ABCPrinter, deren
Methode start() die Großbuchstaben auf der Konsole ausgibt:
public class MehrmalsP {
public static void main(String[] args) {
ABCPrinter p1 = new ABCPrinter();
ABCPrinter p2 = new ABCPrinter();
p1.start();
p2.start();
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
295
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Sequentielle Abarbeitung (2)
public class ABCPrinter {
public void run() {
for (char c=’A’ ; c<= ’Z’ ; c++) {
System.out.print(c);
Machmal.eineSekundeNix();
}
}
public void start() {
run();
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
296
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Liefert die Ausgabe: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
☞ Sequentielle Abarbeitung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
297
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: Thread (1)
Aus ABCPrinter machen wir ABCThread, indem wir von der Klasse
java.lang.Thread ableiten.
Die Klasse Thread hat auch schon eine Methode start(), die genau das
macht, was wir benötigen, nämlich die Methode run() aufrufen.
public class ABCThread extends Thread {
public void run() {
for (char c=’A’ ; c<= ’Z’ ; c++) {
System.out.print(c);
Machmal.eineSekundeNix();
}
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
298
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: Thread (2)
In unserem main-Methode benutzen wir nun ABCThread statt ABCPrinter.
public class MehrmalsT {
public static void main(String[] args) {
ABCThread p1 = new ABCThread();
ABCThread p2 = new ABCThread();
p1.start();
p2.start();
}
}
Dies liefert die Ausgabe: AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ
☞ parallele Abarbeitung
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
299
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Threads in Java (1)
• Die parallel auszuführenden Anweisungen müssen in einer Methode run()
enthalten sein
• oder von run() aus aufgerufen werden.
• Die Methode start() sorgt dafür, dass run() nebenläufig ausgeführt
wird.
• Ruft man run() dagegen direkt auf, entsteht keine Nebenläufigkeit.
• Die Klasse Thread verfügt bereits über eine Methode start().
• und eine Methode run() (die allerdings nichts tut).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
300
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Threads in Java (2)
• Entscheidend für die Implementierung eines Threads ist nicht die Klasse
Thread sondern die Schnittstelle java.lang.Runnable.
• Runnable definiert eine (abstrakte) Methode run().
• Nur Klassen, die Runnable implementieren, können einen Thread realisieren.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
301
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Möglichkeiten zur Implementierung von Threads
• Thread implementiert Runnable, also leiten wir von Thread ab und
überschreiben die Methode run().
• Wir implementieren Runnable in einer eigenen Klasse und lassen Objekte
dieser Klasse von Objekten der Klasse Thread kontrollieren.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
302
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: Runnable (1)
Hier die zweite Möglichkeit: Wir nutzen implements statt extends.
public class ABCRunnable implements Runnable {
public void run() {
for (char c=’A’ ; c<= ’Z’ ; c++) {
System.out.print(c);
Machmal.eineSekundeNix();
}
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
303
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: Runnable (2)
In unserem main-Methode erzeugen wir nun ABCRunnable und steuern diese
Objekte mit Hilfe von Objekten der Klasse Thread.
public class MehrmalsR {
public static void main(String[] args) {
Thread t1 = new Thread(new ABCRunnable());
Thread t2 = new Thread(new ABCRunnable());
t1.start();
t2.start();
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
304
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Die Klasse Thread
Konstruktor (u.a.):
• public Thread(Runnable target)
Bei Aufruf von start() wird die run-Methode von target nebenläufig
ausgeführt.
Instanzmethoden (u.a.):
• public void start()
• public void run()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
305
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• public final boolean isAlive()
liefert true, wenn der Thread gestartet aber noch nicht beendet ist.
• public void interrupt()
setzt das Abbruch-Flag des Threads.
• public boolean isInterrupted()
liefert true, wenn das Abbruch-Flag gesetzt ist.
Klassenmethoden(u.a.):
• public static Thread currentThread()
liefert eine Referenz auf den Thread, der gerade ausgeführt wird.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
306
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• public static void yield()
lässt den Thread, der gerade ausgeführt wird, kurz pausieren, um andere
Threads zum Zuge kommen zu lassen.
• public static void sleep(long millis)
der Thread, der gerade ausgeführt wird, pausiert für millis Millisekunden. InterruptedException möglich, dabei wird das Abbruch-Flag
zurückgesetzt.
• public static boolean interrupted()
liefert true, wenn beim Thread, der gerade ausgeführt wird, das AbbruchFlag gesetzt ist.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
307
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: sleep
public class Machmal {
public static void eineSekundeNix() {
try {
Thread.sleep(1000);
}
catch(InterruptedException e) { }
}
}
Die Methode sleep() kann eine InterruptedException auslösen.
Das Abbruch-Flag des Threads wird dabei zurückgesetzt.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
308
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Threads vorzeitig beenden
• Threads müssen nicht ihre run-Methode komplett abarbeiten. Vielleicht
ist in der run-Methode auch mit Absicht eine Endlosschleife programmiert.
• Idealerweise nutzen wir die Instanzmethoden interrupt() und
isInterrupted().
• Man beachte: Wenn sleep unterbrochen wird, wird eine Exception
ausgelöst und das Abbruch-Flag zurückgesetzt.
• Wenn das Abbruch-Flag gesetzt sein soll, muss deshalb im ExceptionHandler interrupt() aufgerufen werden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
309
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Lebenszyklus eines Threads
• Nach new ist der Thread erzeugt.
• Mit start() wird der Thread ausführbar.
• Mit run() kann der Thread laufend werden. Dieser Zustand ist ein
Spezialfall von ausführbar.
• Der Thread läuft i.d.R. nicht permanent, sondern wird zwischendurch
suspendiert, z.B. durch yield(). Dann ist er nur noch ausführbar, aber
nicht laufend.
• Mit der Terminierung von run() ist der Thread beendet.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
310
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• Im Zustand ausführbar kann durch sleep() oder wait() der Thread in
den Zustand nicht ausführbar überführt werden.
• Mit Hilfe von notify() wird ein nicht ausführbarer Thread wieder
ausführbar.
• Mit Hilfe von isAlive kann ermittelt werden, ob ein Thread in den
Zuständen ausführbar oder nicht ausführbar ist.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
311
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Scheduling
• Ein Scheduler verteilt die zur Verfügung stehende Prozessorzeit auf die
einzelnen Threads.
• Das Scheduling ist nicht spezifiziert, sondern hängt von der virtuellen
Maschine ab.
• Es ist aber sichergestellt, dass ein Thread von höherer Priorität durchschnittlich mehr Prozessorzeit erhält.
• präemptives Scheduling: Die Threads werden unterbrochen.
• Ein Thread erhält zunächst die Priorität des Threads, der ihn erzeugt.
Der main-Thread hat die Priorität 5 (NORM PRIORITY).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
312
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• Methoden zur Steuerung der Priorität: getPriority und setPriority.
• Höchste Priorität gleich 10 (MAX PRIORITY), niedrigste gleich 1
(MIN PRIORITY).
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
313
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Synchronisation
• Ein Thread schreibt Werte in ein Objekt, ein anderes liest Werte aus dem
selben Objekt.
• Wird der schreibende Thread unterbrochen, bevor er den Schreibvorgang
komplett abgeschlossen hat, liest der andere Thread inkonsistente Werte.
• Leser/Schreiber-Problem
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
314
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: Leser/Schreiber (1)
public class Sequenz {
private static int zaehler = 0;
public static void nachster() {
int zahl = zaehler;
eine Anweisung die lange dauert ...
System.out.print(" " + zahl);
zaehler++;
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
315
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Beispiel: Leser/Schreiber (2)
public class ZaehlThread extends Thread {
public void run() {
for (;;)
Sequenz.naechster();
}
}
Wie sieht die Ausgabe u.U. aus, wenn zwei ZaehlThreads parallel laufen?
0 1 2 2 4 5 6 6 8 ...
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
316
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Sperren, Monitor
• Das Problem des letzten Beispiels können wir prinzipiell durch Sperren
(Locks) lösen.
• Immer wenn ein Thread die Methode naechster() betritt, wird diese
Methode für alle anderen Threads gesperrt.
• Threads, die eine gesperrte Methode betreten wollen, werden solange
supendiert, bis die Sperre freigegeben wird.
• Die Sperre wird freigegeben, sobald der ausführende Thread die Methode
naechster() verlassen hat.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
317
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• Nun kann ein anderer Thread in die Methode naechster() eintreten.
Damit sperrt er diese Methode wiederum für alle anderen Threads.
• Fazit: maximal ein Thread soll sich in der Methode naechster() befinden
(kritischer Abschnitt).
• In der Programmierung bezeichnet man dies als Monitor.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
318
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Monitor mit synchronized
• In Java ist es leicht, einen Monitor zu implementieren.
• Mit dem Schlüsselwort synchronized erreichen wir, dass sich maximal ein Thread in der durch synchronized gekennzeichneten Methode
befinden darf.
synchronized public static void naechster() { ... }
Damit wäre gewährleistet, dass unsere ZaehlThreads eine korrekte Sequenz
ausgeben:
0 1 2 3 4 5 6 7 8 ...
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
319
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Klassen- und Instanzmethoden mit synchronized
• Eine mit synchronized gekennzeichnete Klassenmethode
höchstens von einem Thread gleichzeitig ausgeführt werden.
kann
• Eine mit synchronized gekennzeichnete Instanzmethode kann prinzipiell
von mehreren Threads gleichzeitig ausgeführt werden.
• Aber für jedes Objekt kann es maximal einen Thread geben, der sich in
einer mit synchronized gekennzeichneten Instanzmethode befindet.
• Bei Instanzmethoden ist die Synchronisation also objektbezogen.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
320
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Das Erzeuger/Verbraucher-Problem
Wir betrachten einen (zunächst abstrakten) einfachen Puffer, der maximal
einen Integer-Wert aufnehmen kann.
abstract class Wert {
protected int wert;
abstract public int get();
abstract public void put(int w);
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
321
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Solch ein Puffer wird von einem Erzeuger-Thread mit den Werten von 0 bis
4 gefüllt.
class Erzeuger extends Thread {
Wert w;
public Erzeuger(Wert w) { this.w = w; }
public void run() {
for (int i=0 ; i<5 ; i++) {
w.put(i);
System.out.println("Erzeuger
put: " + i);
try {
sleep((int) (Math.random() * 100));
}
catch(InterruptedException e) { }
}
} }
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
322
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Ein Verbraucher-Thread holt die Werte aus dem Puffer.
class Verbraucher extends Thread {
Wert w;
public Verbraucher(Wert w) { this.w = w; }
public void run() {
int v;
for (int i=0 ; i<5 ; i++) {
v = w.get();
System.out.println("Verbraucher get: " + v);
try {
sleep((int) (Math.random() * 100));
}
catch(InterruptedException e) { }
}
} }
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
323
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Wir spezialisieren die Pufferklasse Wert zunächst auf einfache Weise:
class SchlechterWert extends Wert {
public synchronized int get() { return wert; }
public synchronized void put(int w) { wert = w; }
}
Unser Testprogramm
public class EVTest1 {
public static void main(String[] args) {
Wert
w = new SchlechterWert();
Erzeuger
e = new Erzeuger(w);
Verbraucher w = new Verbraucher(w);
e.start();
v.start();
} }
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
324
5. Threads, Serverprozesse und Benachrichtigungen
Möglicher Ablauf:
Erzeuger
put:
Verbraucher get:
Erzeuger
put:
Verbraucher get:
Verbraucher get:
Verbraucher get:
Erzeuger
put:
Erzeuger
put:
Erzeuger
put:
Verbraucher get:
0
0
1
1
1
1
2
3
4
4
Threads in Java
• Der Erzeuger produziert zwar die Werte
0 bis 4,
• der Verbraucher entnimmt dem Puffer
aber einige Werte mehrfach bzw. einige
überhaupt nicht.
• Wir müssen dafür sorgen, dass der Verbraucher immer nur dann aktiv wird,
wenn der Erzeuger wieder einen neuen
Wert bereitgestellt hat.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
325
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Object-Methoden zur Steuerung von Threads
Die Klasse Object stellt zur Verfügung:
• public final void wait()
der Thread, der gerade ausgeführt wird, wird suspendiert, bis ein anderer
Thread notify oder notifyAll für das aktuelle Objekt ausführt.
• public final void notify()
reaktiviert einen einzelnen Thread, der sich im Wartezustand bezüglich
des aktuellen Objekts befindet.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
326
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• public final void notifyAll()
reaktiviert alle Thread, die sich im Wartezustand bezüglich des aktuellen
Objekts befinden.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
327
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Eine bessere Spezialisierung des abstrakten Puffers:
class GuterWert extends Wert {
private boolean verfuegbar = false;
public synchronized int get() {
if (!verfuegbar)
try {
wait();
}
catch (InterruptedException ie) { }
verfuegbar = false;
notify();
return wert;
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
328
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
public synchronized int put(int w) {
if (verfuegbar)
try {
wait();
}
catch (InterruptedException ie) { }
wert = w;
verfuegbar = true;
notify();
}
}
• Das Flag verfuegbar zeigt an, ob ein Wert bereitsteht.
• Kein Wert verfügbar, dann wait() in get().
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
329
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
• put() weckt mit notify() den Verbraucher-Thread, wenn Wert zur
Verfügung steht.
• put()/get() analog
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
330
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Im Testprogramm ändern wir die Zeile zur Erzeugung des Puffers:
Wert w = new GuterWert();
Damit erhalten wir dann eine saubere Verarbeitung:
Erzeuger
Verbraucher
Erzeuger
Verbraucher
Erzeuger
Verbraucher
Erzeuger
Verbraucher
Erzeuger
Verbraucher
put:
get:
put:
get:
put:
get:
put:
get:
put:
get:
0
0
1
1
2
2
3
3
4
4
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
331
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Java
Zusammenfassung
• Threads: parallele Kontrollflüsse in einem Programm
• Implementierung: implements Runnable oder extends Thread
• kritische Bereiche, Monitor: synchronized
• Gegenseitiges Warten: wait(), notify()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
332
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Prozesse und Threads in Android
• Jede gestartete Applikation ist eigener Prozess und läuft in eigener Dalvik
VM
• Prozess startet User-Interface-Thread (UI-Thread), der für die “sichtbaren” Bestandteile der Applikation zuständig ist.
• Start-Activity (siehe Manifest) läuft im UI-Thread
• Problem: Aufwendige Berechnungen im UI-Thread lassen View “einfrieren”
• Unresponsiveness löst ANR aus
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
333
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Application Not Responding (ANR)
Wird ausgelöst wenn:
• eine Activity nicht innerhalb von 5 Sekunden auf Benutzereingaben
reagiert,
• ein Broadcast Receiver nicht innerhalb von 10 Sekunden onReceive()
beendet.
Mögliche Konsequenz:
☞ Auslagerung aufwendiger Berechnungen/Operationen in Threads
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
334
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Threads und UI-Operationen
• Threads innerhalb eines Prozesses haben einen gemeinsamen Speicherbereich.
• Deshalb: Threads haben prinzipiell Zugriff auf alle Objekte innerhalb
einer Anwendung
• Aber: Zugriff auf visuelle Komponenten nur über den UI-Thread möglich,
ansonsten Exception
• Konsequenz: Kommunikation zwischen Hintergrund-Thread und UIThread notwendig
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
335
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callback für Threads (1)
Typisches Szenario:
• Button-Click löst langandauernde Berechnung aus
• Auslagerung der langandauernden Berechnung in Hintergrund-Thread
• Ende der Berechnung soll z.B. in einer TextView angezeigt werden
• Problem: Anweisung textView.setText() ausgeführt im HintergrundThread löst Exception aus
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
336
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callback für Threads (2)
Beispiel 5.1. Update einer TextView aus
dem Hintergrund-Thread löst eine Exception
aus.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
337
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callback für Threads (3)
• Handler: Kommunikationsschnittstelle für die Kommunikation zwischen
Threads, Warteschlange für Runnable- bzw. Message-Objekte
• Runnable: Objekte, die etwas ausführen können
• Message: Container für Daten, z.B. Bundle
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
338
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callback für Threads (4)
Handler: Klasse android.os.Handler
• Verschicken und Verarbeiten von Runnable- bzw. Message-Objekten
• Handler-Instanz wird im UI-Thread erzeugt und an Hintergrund-Thread
übergeben
• Hintergrund-Thread legt Runnable- bzw. Message-Objekte in Handler
ab
• Verarbeitung der empfangenen Objekte im UI-Thread
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
339
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callbacks mit Runnable (1)
• Handler-Instanz in UI-Thread (Main Activity) erzeugen
• Runnable definieren und Runnable-Instanz in Main Activity erzeugen
• Hintergrund-Thread definieren und erzeugen, Verweis auf Handler und
Runnable mitgeben, Hintergrund-Thread starten
• In run() des Hintergrund-Thread: Runnable im Handler ablegen mittels
post()
• Wirkung: In Main Activity wird Runnable aus dem Handler ausgelesen
und gestartet
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
340
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callbacks mit Runnable (2)
Beispiel 5.2. Update einer TextView aus
dem Hintergrund-Thread heraus mittels
Handler und Runnable. Diesmal wird keine
Exception ausgelöst.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
341
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callbacks mit Runnable (3)
Alternativen zu post():
• postAtTime(Runnable r, long uptimeMillis)
• postDelayed(Runnable r, long delayMillis)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
342
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callbacks mit Message (1)
• Spezialisierte Handler-Klasse erzeugen, dabei handleMessage() überschreiben, in handleMessage() UI-Operationen durchführen
• In UI-Thread (Main Activity) Instanz des spezialisierten Handlers erzeugen, Verweis auf Main Activity mitgeben.
• Hintergrund-Thread definieren und erzeugen, Verweis auf Handler mitgeben, Hintergrund-Thread starten
• In run() des Hintergrund-Thread: Message erzeugen und im Handler
ablegen mittels sendMessage()
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
343
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
• Wirkung: im UI-Thread wird handleMessage() der spezialisierten
Handler-Klasse ausgeführt
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
344
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callbacks mit Message (2)
Beispiel 5.3. Update einer TextView aus
dem Hintergrund-Thread heraus mittels spezialisiertem Handler und Message. Es wird
keine Exception ausgelöst.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
345
5. Threads, Serverprozesse und Benachrichtigungen
Threads in Android
Callbacks mit Message (3)
Alternativen zu sendMessage():
• sendEmptyMessage(int what)
• sendMessageAtTime(Message msg, long uptimeMillis)
• sendMessageDelayed(Message msg, long delayMillis)
• Ein Message-Objekt hat ein Attribut obj vom Typ Object.
Message msg = new Message();
msg.obj = new String("hello world!");
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
346
5. Threads, Serverprozesse und Benachrichtigungen
Services
Eigenschaften von Threads
• Threads sind an eine Anwendung gekoppelt: Bei Beendigung der Anwendung werden auch die Threads beendet.
• Threads sind keine Komponenten!
• Keine direkte Nutzung eines Threads durch eine andere Anwendung.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
347
5. Threads, Serverprozesse und Benachrichtigungen
Services
Services
• Komponenten für den Hintergrund: Services
• Im Prozess einer Activity oder einem eigenen Prozess
• Service kann den Lebenszyklus einer Anwendung überdauern
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
348
5. Threads, Serverprozesse und Benachrichtigungen
Services
Arten von Services
• Local Service
Service, der im gleichen Prozess wie die Anwendung läuft, die den Service
startet
• Remote Service
Service, der in einem eigenen Prozess läuft und seinen eigenen Lebenszyklus hat, unabhängig von den Anwendungen, die den Service benutzen
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
349
5. Threads, Serverprozesse und Benachrichtigungen
Services
Deklaration der Services im Manifest
• Local Service
<service android:name=".LocalService"/>
• Remote Service
<service android:name=".RemoteService"
android:process=":remote"/>
jeweils direkt innerhalb des application-Node
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
350
5. Threads, Serverprozesse und Benachrichtigungen
Services
Implementierung eines Local Service (1)
Ableiten von der Klasse Service und die folgenden Methoden überschreiben:
• public void onCreate()
Wird zu Beginn des Lebenszyklus von Services aufgerufen, vgl. Activity
• public void onDestroy()
analog zu Activity
• public IBinder onBind(Intent intent)
Wird aufgerufen, wenn eine Verbindung zu einem Service aufgebaut wird.
Ergebnis ist vom Typ IBinder.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
351
5. Threads, Serverprozesse und Benachrichtigungen
Services
Implementierung eines Local Service (2)
• IBinder ist eine Schnittstelle, die nicht direkt implementiert wird.
• Stattdessen: von Klasse Binder ableiten
• Binder-Instanz repräsentiert die Verbindung zu einem eventuell entferntem Objekt
• Operationen auf dem entfernten Objekt über das Binder-Objekt
• Im Binder-Objekt für jede Operation auf Service-Objekt eine Methode
vorsehen und/oder weitere Methode für den Zugrif auf das Service-Objekt
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
352
5. Threads, Serverprozesse und Benachrichtigungen
Services
Implementierung eines Local Service (3)
Die Service-Klasse für den Local Service:
public class GpsPositionService extends Service {
private IBinder gpsPositionBinder;
private GpsData gpsData;
@Override
public void onCreate() {
gpsData = new GpsData(...);
gpsPositionBinder = new GpsPositionBinder(this);
}
@Override
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
353
5. Threads, Serverprozesse und Benachrichtigungen
Services
public void onDestroy() { }
@Override
public IBinder onBind(Intent intent) {
return this.gpsPositionBinder;
}
public GpsData getGpsData() {
return this.gpsData;
}
}
Die Binder-Klasse:
public class GpsPositionBinder extends Binder {
private GpsPositionService service;
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
354
5. Threads, Serverprozesse und Benachrichtigungen
Services
public GpsPositionBinder(GpsPositionService service) {
this.service = service;
public GpsPositionService getService() {
return this.service;
}
public GpsData getGpsData() {
return this.service.getGpsData();
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
355
5. Threads, Serverprozesse und Benachrichtigungen
Services
Nutzung eines Local Service
• Verbindung zum Service aufbauen mit Hilfe von ServiceConnection
• Innerhalb von ServiceConnection die Methode
public void onServiceConnected(ComponentName name, IBinder binder)
überschreiben.
• Mit Hilfe der Methode bind() eine Verbindung zu einem Service aufbauen.
• Argumente von bind(): Intent, ServiceConnection, Flags
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
356
5. Threads, Serverprozesse und Benachrichtigungen
Services
• bind() z.B. innerhalb von onResume() verwenden
• Mit Hilfe der Methode stopService() kann man den Service anhalten,
z.B. in onPause()
• Verbindung zum Service unterbrechen: unbindService()
• Direkter Zugriff auf die Service-Instanz möglich
• oder indirekter Zugriff über den Binder
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
357
5. Threads, Serverprozesse und Benachrichtigungen
Services
Nutzung eines Local Service (2)
Aufrufende Activity:
public class MyActivity extends Activity {
private GpsPositionService service;
private GpsPositionBinder binder;
private ServiceConnection connection =
new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name,
IBinder ibinder) {
binder = (GpsPositionService)ibinder;
service = binder.getService();
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
358
5. Threads, Serverprozesse und Benachrichtigungen
Services
}
}
@Override
public void on Resume() {
....
verbindeMitService();
}
@Override
public void onPause() {
Intent intent = new Intent(getApplicationContext(),
GpsPositionService.class);
stopService(intent);
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
359
5. Threads, Serverprozesse und Benachrichtigungen
Services
private void verbindeMitService() {
Intent intent = new Intent(getApplicationContext(),
GpsPositionService.class);
bindService(intent,connection, Context.BIND_AUTO_CREATE);
}
public GpsData ermittlePosition1() {
return service.getGpsData();
}
public GpsData ermittlePosition1() {
return binder.getGpsData();
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
360
5. Threads, Serverprozesse und Benachrichtigungen
Services
Remote Service
• Ein Remote Service ist ein Service, der in einem eigenen Prozess läuft
und
• die Lebensdauer der Komponenten, die ihn gestartet haben, überdauern
kann.
• Kein direkter Zugriff auf das Service-Objekt möglich!
• Mehr Vorarbeit, da Interprozesskommunikation (IPC) stattfinden muss.
• Definition der Interprozesskommunikation mit der Interface Definition
Language (IDL)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
361
5. Threads, Serverprozesse und Benachrichtigungen
Services
Interface Definition Language
• Interprozesskommunikation mit Hilfe spezieller Interfaces
• Definition der Interfaces mittels IDL
• IDL: allgemeine Spezifikationssprache für den Datenaustausch zwischen
Prozessen
• ist unabhängig vom Betriebssystem und der Programmiersprache
• Android-Bibliotheken z.B. in C oder C++ implementiert
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
362
5. Threads, Serverprozesse und Benachrichtigungen
Services
• Parameter und Rückgabewerte werden in einfache Datentypen zerlegt und
unabhängig von Betriebssystem und Programmiersprache repräsentiert
(Marshalling)
• auf der Gegenseite: Umwandlung der unabhängigen Repräsentation in das
Format für Betriebssystem und Programmiersprache (Unmarshalling)
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
363
5. Threads, Serverprozesse und Benachrichtigungen
Services
Android-IDL
• Variante der IDL für Android: AIDL
• siehe /tools/aidl
• Aufgabe: Generierung von Klassen, die Methodenaufrufe via IPC ermöglichen
• Integration in den Build-Prozess der IDE
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
364
5. Threads, Serverprozesse und Benachrichtigungen
Services
Definition eines Remote Service
1. Definition eines AIDL-Interface, das die Methoden definiert, um mit dem
Service zu kommunizieren.
2. Erstellen einer Service-Klasse.
3. Stub-Klasse bzw. IBinder um die Methoden aus dem AIDL-Interface
erweitern.
4. Service-Deklaration im Android-Manifest
5. Nutzung des Service
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
365
5. Threads, Serverprozesse und Benachrichtigungen
Services
Definition AIDL-Interface
In Datei IGpsRemoteService.aidl:
interface IGpsRemoteService {
String getGpsDataAsString();
}
IDE erzeugt daraus IGpsRemoteService.java sowie drei weitere Klassen:
• IGpsRemoteService$Stub$Proxy.class
• IGpsRemoteService$Stub.class
• IGpsRemoteService.class
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
366
5. Threads, Serverprozesse und Benachrichtigungen
Services
Ein Stub entspricht einem Proxy, steht hier für anderen Quelltext (in dem
entfernten Objekt)
Innere Klasse Proxy ist für das Marshalling zuständig.
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
367
5. Threads, Serverprozesse und Benachrichtigungen
Services
Erstellen der Service- und erweitern der Stub-Klasse
public class GpsRemoteService extends Service {
@Override
public void onCreate() { }
@Override
public void onDestroy() { }
@Override IBinder onBind(Intent intent) {
return this.gpsBinder;
}
private final IGpsRemoteService.Stub gpsBinder =
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
368
5. Threads, Serverprozesse und Benachrichtigungen
Services
new IGpsRemoteService.Stub() {
public String getGpsDataAsString() throws RemoteException {
String gpsData = "50.7, 7.11, 69.74";
return gpsData;
}
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
369
5. Threads, Serverprozesse und Benachrichtigungen
Services
Deklaration im Manifest
<service android:name=".GpsRemoteService"
android:process=":remote">
<intent-filter>
<action android:name="de.paket.app.IGpsRemoteService"/>
</intent-filter>
</service>
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
370
5. Threads, Serverprozesse und Benachrichtigungen
Services
Nutzung des Remote Service
public class MyActivity extends Activity {
private IGpsRemoteService mGpsRemoteService;
private OnClickListener mButtonGetGpsDataListener =
new OnClickListener() {
public void onClick(View v) {
TextView tv = (TextView) findViewById(R.id.gpsDatenView);
tv.setText(getOrtsPosition());
}
};
@Override
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
371
5. Threads, Serverprozesse und Benachrichtigungen
Services
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.gps_daten_anzeigen);
Intent intent = new Intent(IGpsRemoteService.class.getName());
bindService(intent, gpsRemoteConnection,
Context.BIND_AUTO_CREATE);
Button buttonGetGpsData =
(Button)findViewById(R.id.opt_gpsDatenAbrufen);
buttonGetGpsData.setOnClickListener(mButtonGetGpsDataListener);
}
private ServiceConnection gpsRemoteConnection =
new ServiceConnection() {
@Override
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
372
5. Threads, Serverprozesse und Benachrichtigungen
Services
public void onServiceConnected(ComponentName name, IBinder bi
mGpsRemoteService =
IGpsRemoteService.Stub.asInterface(binder);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// ...
}
};
private String getOrtsPosition() {
if ( mGpsRemoteService != null ) {
try {
return mGpsRemoteService.getGpsDataAsString();
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
373
5. Threads, Serverprozesse und Benachrichtigungen
Services
catch (RemoteException e) { }
}
return null;
}
}
Mobile Informationssysteme I — Hochschule Bonn-Rhein-Sieg, SS 2010
374
Herunterladen