У більшості розміщених тут рішень пропущено важливий фрагмент: виконувати це без блокування блокування, це ризикує вбити Вашу Службу до її завершення. Побачили це рішення в іншій нитці, відповідаючи і тут.
Оскільки в WaifulBroadcastReceiver застаріло в 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
тому ваша послуга може працювати періодично, а не постійно .