[英]AlarmManager setInexactRepeating fires before specified trigger time
我知道 setInexactRepeating 並不准確,但它也表示它不會在請求的時間之前觸發,這似乎在我的情況下發生。 我將警報設置為每 10001 毫秒后觸發,並在 10000 毫秒后使用常規可運行計時器取消它(取消警報似乎工作正常)並在該可運行計時器中每 10001 毫秒后再次設置警報觸發,但有時它會觸發在新鬧鍾中設置的新請求時間之前。 警報根本不應該觸發,因為我使用可運行的計時器取消它並且手機沒有休眠,所以計時器一直在運行。
我的代碼:
//MainService.java:
public static void setAlarm(Context context) {
Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10001, 10001, pIntent);
MainActivity.showToast(appContext, "set alarm: " + (System.currentTimeMillis() + 10001));
}
}
public static void cancelAlarm(Context context) {
Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
if (pIntent != null) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.cancel(pIntent);
MainActivity.showToast(appContext, "cancel alarm");
}
}
}
public static Runnable timerInterval = new Runnable() {
public void run() {
cancelAlarm(appContext);
handler.postDelayed(timerInterval, 10000);
setAlarm(appContext);
}
};
//AlarmBroadcastReceiver.java:
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MainActivity.showToast(context, "alarm");
if (MainService.service) {
MainService.handler.removeCallbacks(MainService.timerInterval);
MainService.handler.postDelayed(MainService.timerInterval, 10000);
}
}
}
這是預期的行為嗎? 還是我做錯了什么?
這是我能想到的唯一解決方案。 我認為是因為alarmManager.cancel(pIntent) 有一些延遲,有時它沒有按時取消它並且警報事件會觸發(即使它應該被取消),所以我基本上忽略它會發生這種情況,但這樣做似乎有點像黑客。 如果有人知道立即取消警報的正確方法,請告訴我們!
//MainService.java:
public static void setAlarm(Context context) {
Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10001, 10001, pIntent);
MainActivity.showToast(appContext, "set alarm: " + (System.currentTimeMillis() + 10001));
}
}
public static void cancelAlarm(Context context) {
Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
if (pIntent != null) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.cancel(pIntent);
MainActivity.showToast(appContext, "cancel alarm");
}
}
}
public static long timerIntervalTime;
public static Runnable timerInterval = new Runnable() {
public void run() {
timerIntervalTime = System.currentTimeMillis();
cancelAlarm(appContext);
handler.postDelayed(timerInterval, 10000);
setAlarm(appContext);
}
};
//AlarmBroadcastReceiver.java:
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (MainService.service) {
if ((System.currentTimeMillis() - MainService.timerIntervalTime) >= 10001) { //this alarm was canceled but for some reason still fired, possibly because of some delay with canceling
MainActivity.showToast(context, "alarm");
MainService.handler.removeCallbacks(MainService.timerInterval);
MainService.handler.postDelayed(MainService.timerInterval, 10000);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.