swirl logo

About     Archive     Feed     Impressum

Android: Service beim Bootvorgang starten

Hintergrund

Wird für eine App eine permanente Verarbeitung im Hintergrund erfordert, so wird hierfür meist ein Service verwendet. Dieser kann bei Bedarf - beispielsweise in Interaktion mit dem Benutzer - gestartet werden, oder soll unabhängig von Benutzeraktivitäten permanent im Hintergrund laufen. Dies erfordert das Einklinken des Service-Starts in den Boot-Prozess:

Integration des Services in den Boot-Prozess

Zur Integration sind folgende Schritte notwendig:

  1. Permission "RECEIVE_BOOT_COMPLETED" im Manifest ergänzen
  2. Individuelle Implementierung eines BroadcastReceiver
  3. BroadcastReceiver im Manifest registrieren

1. Permission ergänzen

Im Manifest der Applikation muss folgende Berechtigung eingefügt werden:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2. BroadcastReceiver implementieren

Der stattgefundene Boot-Prozess wird mittels dem Broadcast "BOOT_COMPLETED" signalisiert. Hierzu wird ein separater BroadcastReceiver benötigt, der auf diesen Broadcast lauscht und den Start des Services vornimmt:

public class OnBootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startServiceIntent = new Intent(context, ExampleService.class);
        context.startService(startServiceIntent);
    }
}

3. BroadcastReceiver registrieren

Zuletzt muss der zuvor erzeugte Receiver im Manifest registriert werden. Der full-qualified Package-Name muss entsprechend ergänzt werden. Etwaige Attribute wie enabled oder exported müssen nicht gesetzt werden. Die Default-Werte sind in diesem Fall bereits korrekt.

<receiver android:name="de.example.BootBroadcastReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>  
</receiver>
Wichtig! Der Aufruf des OnBootReceivers erfolgt nur, wenn die App sich auf dem internen Speicher befindet! Wurde die App auf der SD-Karte installiert, wird der Receiver nicht aufgerufen und somit auch der Service nicht gestartet. Es ist somit empfehlenswert die Installation auf SD-Karte vornherein zu unterbinden: Hierzu muss das Attribut installLocation auf den Wert "internalOnly" gesetzt werden:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="de.example.test"
  android:versionCode="1"
  android:versionName="1.0" 
  android:installLocation="internalOnly">
  ...
Hire me!