Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Haupttitel der Präsentation

Ähnliche Präsentationen


Präsentation zum Thema: "Haupttitel der Präsentation"—  Präsentation transkript:

1 Haupttitel der Präsentation
WIFI Bundesland

2 Hintergrundverarbeitung 1/2
Oft ist es entweder notwendig oder zumindest erwünscht, Tätigkeiten im Hintergrund, also Benutzer-Interaktion durchzuführen Dies kann z.B. die regelmäßige Abfrage eines WebServices sein oder eine Verarbeitung die länger dauert und die App soll nicht „ins Stocken“ geraten Android stellt vor allem zwei Möglichkeiten zur Verfügung, um im Hintergrund Abfragen, Berechnungen, … durchzuführen

3 Hintergrundverarbeitung 2/2
Services/Dienste Keine Benutzeroberfläche Eigenes Programm, keine Abhängigkeit von App Für lang und ständig laufende Hintergrundaufgaben Für das System (fast) so wichtig wie aktive Apps, werden somit (fast) nie vom System beendet Hintergrund-Tasks Hängen an der App zu der Sie gehören, bei Neustart der App, zB auch durch Neuorientierung des Gerätes, wird Task beendet Eher für einmalige, kurze Aufgaben

4 Registrieren eines Dienstes
Um einen Dienst verwenden zu können, muss er, so wie Aktivitäten, in der Manifest-Datei erwähnt sein <service android:enabled=„true“ android:name=„.MeinDienst“/>

5 Erstellen und kontrollieren von Diensten
Ableiten der Klasse Service auf eine eigene Klasse Überschreiben von (zumindest) onBind() public class MeinDienst extends Service { @Override public IBinder onBind(Intent intent) { return null;} }

6 Starten von Diensten 1/2 Überschreiben von onStartCommand() der Klasse Service in der eigenen Ableitung @Override public int onStartCommand(Intent intent, int flags, int startId) { startHintergrundAufgabe(intent, startId); return Service.START_STICKY; } Der Rückgabe-Wert START_STICKY – wird neu gestartet, wenn beendet START_NOT_STICKY START_REDELIVER_INTENT – wie STICKY, aber Indent wird wieder mitgegeben.

7 Starten von Diensten 2/2 Um einen Dienst zu starten wird startService() aufgerufen. Wie bei Aktivitäten gibt es zwei Methoden Dienste zu starten bzw. starten zu lassen Explizit: Die Klasse des Dienstes wird ausdrücklich (explizit) angeführt Somit bestimmt der Klassenname welcher Dienst gestartet wird Intent intent = new Intent(this, MeinDienst.class) Implizit: Ein registrierter Intent-Receiver vorausgesetzt, wird dem System mitgeteilt, was denn passieren soll und dadurch implizit der Dienst ausgewählt Intent intent = new Intent(MeinDienst.HOLE_HINTERGRUND) intent.putExtra(MeinDienst.URL, „orf“); startService(intent)

8 Stoppen von Diensten Um einen Dienst zu stoppen wird stopService() aufgerufen. Wie beim Start gibt es zwei Methoden Dienste zu starten bzw. starten zu lassen Explizit: Intent intent = new Intent(this, MeinDienst.class) Implizit: Intent intent = new Intent(MeinDienst.HOLE_HINTERGRUND) stopService(intent) Wenn ein Dienst seine Tätigkeit beendet hat, kann er sich auch selber mit stopSelf() beenden

9 Verbinden von Diensten mit Aktivitäten 1/3
Verbinden von Diensten mit Aktivitäten ermöglicht das Aufrufen von Methoden eines laufenden Dienstes aus der verbundenen Aktivität Um Aktivitäten mit Diensten zu verbinden, wird der schon erwähnte Event-Handler onBind() in Kombination mit einer eigenen Binder-Klasse abgeleitet von Binder eingesetzt. private final IBinder binder = new MeinBinder(); public IBinder onBind(Intent intent) { return binder;} public class MeinBinder extends Binder { MeinDienst getService() { return MeinDienst.this; }

10 Verbinden von Diensten mit Aktivitäten 2/3
Die Verbindung wird von einer Instanz der Klasse ServiceConnection gespeichert Die Event-Handler onServiceConnected() und onServiceDisconnected() sollten überschrieben werden Danach kann mit bindService() der Dienst verbunden werden (Nicht vergessen das Service zu starten)

11 Verbinden von Diensten mit Aktivitäten 3/3
private MeinDienstService dienstRef; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(…, IBinder service) { dienstRef = (…)service.getService(); } public void onServiceDisconnected(…) { dienstRef=null; }}; Intent bindIntent = …; bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);

12 Einsatz von Hintergrund-Tasks
Vor allem um „Hängen“ der Applikation zu vermeiden, sollten und können Aufgaben, die mehr als rund 500 Millisekunden dauern im Hintergrund erledigt werden. So es sich bei diesen Aufgaben um Eher kurz dauernd Einmalig durchzuführen Mit Anschluss an die Benutzeroberfläche handelt, bietet sich der Einsatz von AsyncTask an.

13 Erstellen eines asynchronen Hintergrund-Tasks (AsyncTask)
Vererben von Klasse AsyncTask mit den zu verwendenden Typen von Parametern in der Reihenfolge Input, Fortschritt, Output private class MeinTask extends AsyncTask<String, Integer, String> { protected String doInBackground(String… parameter) // im Hintergrund, mit publishProgress(x) wird Fortschritt // kommuniziert protected void onProgressUpdate(Integer… progress) // UI aktualisieren protected void onPostExecute(String result) //Aufgabe erledigt, UI aktualisieren

14 Starten eines asynchronen Hintergrund-Tasks
Instanzieren der abgeleiteten Klasse Aufruf der Methode execute() dieser Instanz String input = „ MeinTask hintergrund = new MeinTask(); hintergrund.execute(input);

15 Üben Erstellen Sie eine Aktivität mit zwei Buttons, [Start Dienst] und [Stop Dienst]. Bei Klick auf einen der Buttons wird die jeweilige Aktion ausgeführt. Der Dienst soll jede Sekunde in das Log einen Text schreiben. Erweitern Sie die Aktivität um einen Button, der einen Zähler im Service ausgibt. (Der Zähler soll mit jedem Log Eintrag um 1 erhöht werden) Erstellen Sie einen Hintergrund-Task der in einer Schleife von 1 bis 10 zählt, pro Schritt eine halbe Sekunde wartet und nach jedem Schritt einen Text mit dem aktuellen Wert anzeigt.

16 Verwenden von Alarm Um ressourcenschonend Dienste einzusetzen (=damit diese nicht ständig laufen) kann man mit Alarmen arbeiten Um einen Alarm einzusetzen, verwendet man den AlarmManager mit Intent, PendingIntent und set() bzw. setRepeating()/setInexactRepeating() AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); int alarmType=AlarmManager.ELAPSE_REALTIME_WAKEUP String ALARM_ACTION =„ALARM_ACTION“ Intent intent=new Intent(ALARM_ACTION) PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent,0); alarmManager.setInexactRepeating(alarmType, 120, 120, alarmIntent); alarmManager.cancel(alarmIntent);

17 Wichtige Befehle Im Manifest registrieren
onCreate(), onBind(), onStartCommand() aus Service überschreiben startService() stopService(), stopSelf() bindService() doInBackground() onProgressUpdate() onPostExecute() execute() AlarmManager setInexactRepeating()

18 Üben Erstellen Sie einen Dienst, der alle fünf Minuten einen RSS-Dienst ihrer Wahl abfrägt und wenn es einen oder mehrere neue Einträge gibt, diese in eine lokale Datenbank speichert Erstellen Sie einen Alarm, der jede Stunde die Aktivität „Pause machen“ aufruft. Diese Aktivität zeigt den Text „Jetzt! Pause! Machen!“ an

19 Zusammenfassung


Herunterladen ppt "Haupttitel der Präsentation"

Ähnliche Präsentationen


Google-Anzeigen