Hầu hết các giải pháp được đăng ở đây đều thiếu một phần quan trọng: làm điều đó mà không có khóa đánh thức có nguy cơ Dịch vụ của bạn bị giết trước khi xử lý xong. Xem giải pháp này trong một chủ đề khác, trả lời ở đây.
Vì WakefulBroadcastReceiver không được dùng nữa trong api 26 nên bạn nên sử dụng các Cấp API dưới 26
Bạn cần phải có khóa đánh thức. May mắn thay, thư viện Hỗ trợ cung cấp cho chúng tôi một lớp học để làm điều này:
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);
}
}
sau đó, trong Dịch vụ của bạn, hãy đảm bảo mở khóa đánh thức:
@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);
}
Đừng quên thêm quyền WAKE_LOCK và đăng ký bộ thu của bạn trong tệp kê khai:
<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()
dịch vụ của bạn. Nếu không, Android và người dùng của nó sẽ giết chết dịch vụ của bạn vì lãng phí dung lượng và bạn sẽ nhận được một số nhận xét khó chịu trong Android Market. Hầu hết các tình huống mà bạn nghĩ rằng bạn muốn một dịch vụ bắt đầu lúc khởi động, bạn được phục vụ tốt hơn khi sử dụngAlarmManager
để dịch vụ của bạn có thể chạy định kỳ thay vì liên tục .