โซลูชันส่วนใหญ่ที่โพสต์ไว้ที่นี่ขาดส่วนสำคัญ: การทำโดยไม่ล็อกการปลุกจะเสี่ยงต่อการที่บริการของคุณจะถูกฆ่าก่อนที่จะดำเนินการเสร็จสิ้น เห็นวิธีแก้ปัญหานี้ในกระทู้อื่นตอบที่นี่เช่นกัน
เนื่องจากWakefulBroadcastReceiverเลิกใช้งานแล้วใน api 26 จึงขอแนะนำ สำหรับระดับ API ที่ต่ำกว่า 26
คุณต้องได้รับ Wake Lock โชคดีที่ไลบรารี Support ให้ชั้นเรียนทำสิ่งนี้:
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
เพื่อให้บริการของคุณสามารถทำงานเป็นระยะ ๆมากกว่าอย่างต่อเนื่อง