Trong Android, bạn có thể đặt AlarmManger
để đánh thức mỗi X mili giây và chạy PendingIntent
.
Mã này trông giống như thế này.
AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime()+60000,
PERIOD,
pi);
Mặc định của Android IntentService
chạy trong nền có một số hạn chế.
Bạn cũng có thể xem qua thư viện bên ngoài WakefulIntentService
(https://github.com/commonsguy/cwac-wakeful). Tôi sử dụng nó cùng với AlarmManager
để chạy các tác vụ nền.
Cập nhật:
OnAlarmReceiver lớp
public class OnAlarmReceiver extends BroadcastReceiver {
public static String TAG = "OnAlarmReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Waking up alarm");
WakefulIntentService.sendWakefulWork(context, YourService.class); // do work in the service class
}
}
YourService lớp
public class YourService extends WakefulIntentService {
public static String TAG = "YourService";
public YourService() {
super("YourService");
}
@Override
protected void doWakefulWork(Intent intent) {
Log.d(TAG, "Waking up service");
// do your background task here
}
}
Đây dường như là một điểm khởi đầu tốt. Tôi đã thực hiện lớp 'OnAlarmReceiver' bằng cách mở rộng' BroadcastReceiver'. Tôi có cần gọi 'registerReceiver' ở đâu đó để nghe ý định được phát trong dòng thứ ba không? Không thể tìm thấy 'registerReceiver' trong codebase của' WakefulIntentService', và tôi đang bối rối. –
@MikeC Tôi đã cập nhật câu trả lời với ví dụ hoàn chỉnh. Bạn cũng sẽ phải xác định dịch vụ và bộ thu của bạn trong tệp kê khai để làm cho nó hoạt động. – Sharj
Tôi không kết thúc bằng cách sử dụng 'WakefulIntentService', nhưng cảm ơn đã chỉ cho tôi đúng hướng. –