Sebagian besar solusi yang diposting di sini kehilangan bagian penting: melakukannya tanpa kunci pengaktifan menjalankan risiko Layanan Anda terbunuh sebelum selesai diproses. Melihat solusi ini di utas lain, menjawab di sini juga.
Karena WakefulBroadcastReceiver sudah tidak digunakan lagi dalam api 26, direkomendasikan untuk API Level di bawah 26
Anda perlu mendapatkan penguncian layar saat aktif. Untungnya, pustaka Dukungan memberi kita kelas untuk melakukan ini:
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);
}
}
kemudian, di Layanan Anda, pastikan untuk melepaskan kunci layar aktif:
@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);
}
Jangan lupa untuk menambahkan izin WAKE_LOCK dan daftarkan penerima Anda di manifes:
<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()
dalam layanan Anda. Jika tidak, Android dan penggunanya akan mematikan layanan Anda sebagai pemborosan ruang, dan Anda akan mendapatkan beberapa komentar tidak menyenangkan di Android Market. Dalam kebanyakan situasi di mana Anda merasa ingin layanan dimulai pada waktu boot, Anda lebih baik dilayani menggunakanAlarmManager
sehingga layanan Anda dapat berjalan secara berkala daripada terus menerus .