В большинстве решений, размещенных здесь, отсутствует важная деталь: выполнение этого без блокировки пробуждения может привести к тому, что ваша служба будет убита до того, как она завершит обработку. Видел это решение в другой ветке, отвечая и здесь.
Поскольку 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>
startForeground()
в своем сервисе. В противном случае Android и его пользователи убьют ваш сервис как пустую трату места, и вы получите неприятные комментарии в Android Market. В большинстве ситуаций, когда вы думаете, что хотите, чтобы служба запускалась во время загрузки, вам лучше использовать,AlarmManager
чтобы ваша служба могла запускаться периодически, а не постоянно .