Tôi đang phát triển một ứng dụng sẽ thực hiện một tác vụ nhất định sau mỗi 60 giây. Vì có một số vấn đề về độ chính xác với báo thức trong Android 4.4 trở lên, trong đó tất cả báo thức không chính xác, tôi đã chọn kiểu chuỗi: A BroadcastReceiver
kích hoạt báo thức đầu tiên và mỗi lần báo thức sẽ đặt báo thức tiếp theo.Android set() và setExact() báo động kích hoạt vào khoảng thời gian không chính xác
Vấn đề là, mặc dù tôi đang đặt báo thức trong khoảng thời gian 60 giây (60000 mili giây), báo thức kích hoạt ở khoảng thời gian 5 giây và đôi khi thậm chí còn ít hơn. Tôi đã thử nghiệm mã trên Nexus 5 (Android 5.1.1) và trên trình giả lập Android 5.0.1, cả hai đều cho kết quả tương tự. Tôi nên chỉ ra rằng cả hai người nhận đều được đăng ký trên AndroidManifest và ứng dụng của tôi có quyền RECEIVE_BOOT_COMPLETED.
EDIT: setExact() gây ra chính xác cùng một vấn đề
StartupReceiver.java (BroadcastReceiver cho BOOT_COMPLETED):
public class StartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Got the BOOT_COMPLETED signal");
// Get the first alarm to be invoked immediately
AlarmReceiver.setNextScanAlarm(context, 0);
}
}
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Start the service
Intent startServiceIntent = new Intent(context, BackgroundService.class);
startServiceIntent.putExtra("interval", 60000);
startServiceIntent.putExtra("action", "scan");
context.startService(startServiceIntent);
// Schedule the next alarm
setNextScanAlarm(context, 60000);
}
public static void setNextScanAlarm(Context context, int interval) {
Intent scanIntent = new Intent(context, AlarmReceiver.class);
scanIntent.putExtra("interval", interval);
scanIntent.putExtra("action", "scan");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
0,
scanIntent,
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
interval,
pendingIntent);
}
}
gì có thể là vấn đề?
Chỉ cần một câu hỏi nhanh là bạn thực sự làm bất cứ điều gì với báo động hoặc chỉ cố gắng chạy một số mã trong nền hoặc giao diện người dùng chính mỗi 60 giây? – napkinsterror