В большинстве решений, опубликованных здесь, отсутствует важная часть: выполнение без блокировки от пробуждения может привести к гибели вашей Службы до завершения ее обработки. Видел это решение в другой ветке, отвечая и здесь.
Поскольку WakefulBroadcastReceiver устарел в API 26, рекомендуется для уровней API ниже 26
Вам нужно получить замок от пробуждения. К счастью, библиотека поддержки дает нам класс для этого:
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);
}
}
затем в вашем Сервисе обязательно снимите блокировку от пробуждения:
@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);
}
Не забудьте добавить разрешение WAKE_LOCK и зарегистрировать получателя в манифесте:
<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>