Android Tutorial Service Module / Dienstleistungs-Module

klaus

Expert
Licensed User
Longtime User
Englisches Originaltutorial.

Basic4android v1.2 enthält jetzt Unterstützung für Service-Module.
Service-Module spielen eine wichtige Rolle in der Anwendung und dem Prozess-Lebenszyklus.
Beginnen Sie mit diesem Tutorial Android Prozesse und Activities Lebensdauer, wenn Sie es noch nicht gelesen haben.
Code der in einem Activity Modul geschrieben ist, wird angehalten wenn die Activity nicht sichtbar ist.
Also wenn man nur Activities benutzt ist es nicht möglich, irgendeinen Code auszuführen, während die Anwendung nicht sichtbar ist.
Der Service (Dienstleistung) Lebenszyklus ist (fast) nicht von der aktuellen sichtbaren Activity betroffen. So können Sie Aufgaben im Hintergrund laufen lassen.
Services benutzen in der Regel die Statusleiste (staus bar) um mit dem Benutzer zu kommunizieren. Services haben keine andere sichtbare Elemente. Services können auch keinen Dialoge anzeigen (mit Ausnahme von ToastMessages / Toast Nachrichten).

Beachten Sie, daß beim Auftreten eines Fehlers in einem Service-Code, der Dialog "Do you want to continue?" / "Wollen Sie weitermachen?" nicht angezeigt wird. Der Android normale Dialog "Process has crashed" / "Prozess ist abgestürzt" wird statt dessen angezeigt.
Bevor wir in die Details gehen möchte ich sagen, daß die Benutzung von Services einfacher ist als es auf den ersten Blick erscheint. In der Tat ist es für viele Aufgaben einfacher mit einem Service zu arbeiten als mit einer Activity weil ein Service nicht angehalten (paused ) wird weder noch erstellt (resumed) wird und Services auch nicht neu erstellt werden wenn der Benutzer das Gerät dreht. Es braucht nichts Besonderes im Code der in einem Service geschrieben ist.

Code, in einem Service-Modul, läuft im gleichen Prozess und im gleichen Thread wie alle anderen Codes.

Es ist wichtig zu verstehen, wie Android wählt, welcher Prozess zu zerstören ist, wenn es in Speichermangel kommt (ein neuer Prozess wird später nach Bedarf erstellt).
Ein Prozess kann sich in einem der drei folgenden Zustände befinden:
- Vordergrund - Der Benutzer sieht derzeit eine der Prozess- Activities.
- Hintergrund - Keine der Activities des Prozesses ist sichtbar, jedoch gibt es eine begonnenes Service.
- Pause - Es gibt keine sichtbaren Activities und auch keine begonnene Services.

Angehalten Prozesse sind die ersten die zerstört werden, wenn nötigt. Wenn es immer noch nicht genügend Arbeitsspeicher gibt, werden Hintergrundprozesse zerstört.
Vordergrund Prozesse werden in der Regel nicht zerstört.

Wie man bald sehen wird, kann ein Service auch einen Prozess in den Vordergrund bringen.

Zum hinzufügen eines neuen Service-Moduls muß man im Menü Project - Add New Module - Service Module wählen.
Die Vorlage für neue Services sieht so aus:
B4X:
Sub Process_Globals
 
End Sub
 
Sub Service_Create
 
End Sub
 
Sub Service_Start
 
End Sub
 
Sub Service_Destroy
 
End Sub
Sub Process_Globals ist die Stelle, um Service globale Variablen zu deklarieren. Es gibt keine andere Globals Sub, wie in Activities, da Service keine Activity-Objekte unterstützt.
Sub Prozess_Globals sollte nur verwendet werden, um Variablen zu deklarieren. Es sollte keinen anderen Code enthalten, da dies scheitern könnte. Dies gilt auch für andere Module.
Beachten Sie, dass Process_Global Variablen, solange gültig sind solange der Prozess läuft, und sie sind auch von anderen Modulen erreichbar.

Sub Service_Create wird aufgerufen, während dem ersten Start des Service. Dies ist die Stell um die Prozess globalen Variablen zu initialisieren und zu setzten. Sobald ein Service gestartet ist, bleibt es aktiv, bis man StopService anruft oder bis der ganze Prozess zerstört wird.

Sub Service_Start wird bei jedem Aufruf von StartService (oder StartServiceAt) aufgerufen. Wenn diese Subs laufen, wird der Prozess in den Vordergrund gebracht. Was bedeutet, daß das Betriebssystem den Prozess nicht zerstören wird solange diese Subroutine läuft. Wenn man einen Code alle Paar Minuten / Stunden laufen lassen will, muß man die nächste Aufgabe mit StartServiceAt innerhalb dieser Subroutine vorsehen.

Sub Service_Destroy wird aufgerufen, wenn man StopService aufruft. Das Service wird nach dieser Subroutine nicht mehr laufen, bis man StartService wieder anruft (die dann Sub Service_Create laufen läßt gefolgt von Sub Service_Start).


Service use cases / Service Benutzungen

So wie Ich es sehe gibt es vier Hauptfälle für die Benutzung von Services.

- Trennung von UI-Code mit "Business" oder Logik-Code. Das Schreiben von Nicht-UI-Code in einem Service ist einfacher als innerhalb eines Activity-Moduls, da ein Service nicht angehalten (paused) und nicht fortgesetzt (resumed) wird, und es normalerweise auch nicht neu erstellt (recreated) wird wie ein Activity.
Man kann StartService in Activity_Create aufrufen und ab jetzt mit dem Service-Modul arbeiten.
Am Besten ist es wenn die Activity in der Activity_Resume Routine die nötigen Daten vom Service holt. Die Activity kann die Daten in Prozess globalen Variablen lesen oder mit CallSub die Daten in einer Sub im Service lesen.

- Ausführung langer Funktionen. Zum Beispiel das Herunterladen einer großen Datei aus dem Internet. In diesem Fall ruft man Service.StartForeground (im Service-Modul) auf. Dadurch wird die Activity in den Vordergrund gebracht und es wird sicherstellen daß das OS sie nicht zerstört. Am Ende nicht vergessen, eventuell Service.StopForeground aufzurufen.

- Planung einer sich wiederholenden Aufgabe. Durch den Aufruf von StartServiceAt kann man planen daß das Service zu einem bestimmten Zeitpunkt startet. Man kann StartServiceAt in Sub Service_Start aufrufen um den nächsten Zeitpunkt zu planen und seine sich wiederholenden Aufgabe zu erstellen (zum Beispiel eine Aufgabe, die alle paar Minuten nach Updates sucht).

- Ein Service nach dem Booten ausführen. Die Überprüfung von Project - Service properties - Run At Boot erlaubt das Service nach dem Booten durchzuführen.

Notifications / Meldungen


Meldungen in der Statusleiste können von Activities and Services angezeigt werden.
Normalerweise benutzen Services Meldungen um mit dem Benutzer zu kommunizieren. Die Meldung zeigt ein Icon in der Statusbar an. Wenn man die Statusbar öffnet sieht man die Meldung.

Beispiel einer Notification (mit den StandardIcon):

notification_1.png



notification_2.png


Der Benutzer kann auf die Nachricht klicken, das öffnet eine Activity die in dem 'Notification object' definiert wurden.

Das Notificationicon ist eine Bilddatei das man manuell in den Order '<project folder>\Object\res\drawable' einfügen muß.

Accessing other modules / Zugriff auf andere Module

Prozess globale Objekte sind öffentlich (public) und können von anderen Modulen erreicht werden.
Mit der CallSub Methode kann man auch Subroutinen in anderen Modulen aufrufen.
Es ist jedoch auf Module beschränkt die nicht angehalten werden können (non-paused modules). Dies bedeutet, daß eine Activity niemals eine Subroutine in einer anderen Activity aufrufen kann denn es kann nur eine Activity aktiv sein.
Doch eine Activity kann auf ein laufendes Service zugreifen und ein Service kann auf eine laufende Activity zugreifen.
Beachten Sie, daß, wenn die Zielkomponente angehalten (paused ) ist, ein leerer String zurück gegeben wird.
Keine Ausnahme (exception) wird ausgelöst.
Man kann IsPause überprüfen, ob das Ziel-Modul angehalten ist oder nicht.

Zum Beispiel, wenn ein Service einige Informationen heruntergeladen hat kann es folgendes aufrufen:
B4X:
CallSub(Main, "RefreshData")
Wenn die Hauptactivity läuft, holt sie sich Daten von Service-Prozess globalen Variablen um den Bildschirm zu aktualisieren.
Es ist auch möglich, neuen Informationen der Activity Sub zu übergeben. Allerdings ist es besser, die Informationen in Prozess globalen Variablen zu halten. Dies erlaubt der Activity RefreshData aufzurufen, wann immer sie will und sich die Informationen zu holen (da die Activity angehalten sein könnte wenn die neuen Informationen angekommen sind).


Beachten Sie daß es nicht möglich ist CallSub zu benutzen um eine Subroutine in einem Code Modul aufzurufen.

Beispiele:
Downloading a file using s service module englisch, deutsch
Periodically checking Twitter feeds englisch, deutsch
 
Last edited:
Top