Bei den meisten der hier veröffentlichten Lösungen fehlt ein wichtiges Element: Wenn Sie ohne Wake-Lock arbeiten, besteht die Gefahr, dass Ihr Service vor Abschluss der Verarbeitung beendet wird. Ich habe diese Lösung in einem anderen Thread gesehen und auch hier geantwortet.
Da WakefulBroadcastReceiver in API 26 veraltet ist, wird es für API-Level unter 26 empfohlen
Sie benötigen eine Wecksperre. Glücklicherweise gibt uns die Support-Bibliothek eine Klasse , um dies zu tun:
public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// This is the Intent to deliver to our service.
Intent service = new Intent(context, SimpleWakefulService.class);
// Start the service, keeping the device awake while it is launching.
Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
startWakefulService(context, service);
}
}
Stellen Sie dann in Ihrem Dienst sicher, dass die Wecksperre aufgehoben wird:
@Override
protected void onHandleIntent(Intent intent) {
// At this point SimpleWakefulReceiver is still holding a wake lock
// for us. We can do whatever we need to here and then tell it that
// it can release the wakelock.
...
Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
Vergessen Sie nicht, die WAKE_LOCK-Berechtigung hinzuzufügen und Ihren Empfänger im Manifest zu registrieren:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
...
<service android:name=".SimpleWakefulReceiver">
<intent-filter>
<action android:name="com.example.SimpleWakefulReceiver"/>
</intent-filter>
</service>
startForeground()
in Ihrem Dienst. Andernfalls beenden Android und seine Benutzer Ihren Dienst als Platzverschwendung, und Sie erhalten einige unangenehme Kommentare im Android Market. In den meisten Situationen, in denen Sie glauben, dass ein Dienst zum Startzeitpunkt gestartet werden soll, sollten Sie ihn besser bedienen,AlarmManager
damit Ihr Dienst nicht kontinuierlich, sondern regelmäßig ausgeführt werden kann .