Android-Programmierung: Services
Willemers Informatik-Ecke

Ein Service ist eine Komponente einer Anwendung, die im Hintergrund läuft und keine eigene Benutzerinteraktion benötigt. Der Service könnte beispielsweise Musik abspielen oder im Netzwerk Dateien hochladen. Das kann nicht einfach die Activity übernehmen, weil diese auf Benutzeraktivitäten schnell reagieren muss.

Ein Service wird von einer Activity aus gestartet und bleibt auch dann aktiv, wenn die Activity aus dem Vordergrund verdrängt wird. Ist dieses Verhalten nicht erwünscht, kann die Activity beim Verschwinden den Service stoppen.

Ein Service kann aber auch von anderen Clients angefordert werden. Dann spricht man von einem gebundenen Service. Ein solcher Service bleibt im Hintergrund, solange noch mindestens ein Client seines Dienstes bedarf.

Einrichten eines Services

Im Android-Studio wählen Sie app an. Dann können Sie über das Menü

File|New|Service|Service

einen Dialog starten, der einen Service definiert. Als Klassennamen wurde in diesem Beispiel MeinService verwendet. Die Wahl des Namens ist natürlich frei. Nach Finish wird der Rahmen für den Service gebildet.

Sie sehen die Java-Klasse:

public class MeinService extends Service {
    public MeinService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw UnsupportedOperationException("Not yet implemented");
    }
}
Im Manifest wird ein zusätzlicher Eintrag für den Service angelegt:
        <service
            android:name=".MeinService"
            android:enabled="true"
            android:exported="true"></service>

Die Java-Klasse für den Service

Die automatisch erstellte Java-Klasse erhält den von Ihnen im Dialog vorgegebenen Namen. Diese Klasse wird gleich so definiert, dass sie die Android-Klasse Service erweitert.

Sie erhält einen leeren Konstruktor und die Methode onBind.

Für den Lebenszyklus des Services sind die Methoden onStartCommand und on Destroy wichtig.

public class MeinService extends Service {
    public MeinService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service started", Toast.LENGTH_SHORT).show();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service stopped", Toast.LENGTH_SHORT).show();
    }
}
Der Rückgabewert der Methode onStartCommand kann der Service das Neustartverhalten regeln. Mit START_STICKY signalisiert der Servive, dass es seine Umgebung selbst verwaltet und sogar mit dem Intent-Inhalt null gestartet werden kann.

Start des Services

Für den Start eines Services wird die Methode startService aufgerufen. Als Paramter erhält sie einen Intent, der die Informationen über das Ziel und die Parameter des Aufrufs enthält.

Intent intent = new Intent(this, MeinService.class);
startService(intent);
Soll der Service gestoppt werden, verwendet man dazu den Aufruf von stopService

Intent intent = new Intent(this, MeinService.class);
stopService(intent);

Eintrag in der AndroidManifest.xml

Für einen Service wird ein Eintrag in der Manifest-XML-Datei angelegt.
<service android:enabled="true"
            android:name="MeinService"
            android:permission="de.willemer.MEIN_SERVICE_PERMISSION"/>

Bound Service

Statt einen Service mit startService zu starten, kann der Client den Service auch mit bindService anbinden.