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