簡體   English   中英

AlarmManager setInexactRepeating 在指定的觸發時間之前觸發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM