检查是否设置了警报管理器时出现误报

Getting false positive while checking whether alarm manager is set

我有两个闹钟 1.走路提醒 2.提示通知 用户可以取消、步行提醒。取消过程运行良好。

private void setWalkReminder(){
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 18);
    calendar.set(Calendar.MINUTE, 50);
    calendar.set(Calendar.SECOND, 0);
    Intent walkIntent = new Intent(this, AlarmReceiver.class);
    Log.d(TAG, "Started WALK SET");
    walkIntent.putExtra("alarmType", "walkReminder");
    PendingIntent walkPendingIntent = PendingIntent.getBroadcast(this, WALK_REMINDER, walkIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager walkAlarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);
    walkAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 180000 /*AlarmManager.INTERVAL_DAY*/, walkPendingIntent);

    workoutEditor = workoutPrefs.edit();
    workoutEditor.putBoolean("walkReminderIsSet", true);
    workoutEditor.commit();
}

private void cancelWalkReminder(){
    Intent walkIntent = new Intent(this, AlarmReceiver.class);
    PendingIntent walkPendingIntent = PendingIntent.getBroadcast(this, WALK_REMINDER, walkIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    Log.d(TAG, "Walk Canceled");
    AlarmManager walkAlarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);
    walkAlarmManager.cancel(walkPendingIntent);
}

我正在检查是否通过以下方法设置了闹钟:

boolean walkAlarmDown = (PendingIntent.getBroadcast(this, WALK_REMINDER,
            new Intent(this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) == null);

    if (walkAlarmDown && workoutPrefs.getBoolean("walkReminderIsNeeded", true)){
        Log.d(TAG, "WALK REMINDER SET");
        setWalkReminder();
    } else if (!walkAlarmDown && !workoutPrefs.getBoolean("walkReminderIsNeeded", true)){
        Log.d(TAG, "WALK REMINDER CANCELED");
        cancelWalkReminder();
    } else {
        if(!workoutPrefs.getBoolean("walkReminderIsNeeded", true) && walkAlarmDown){
            Log.d(TAG, "Why is this false?");
        } else if (!walkAlarmDown && workoutPrefs.getBoolean("walkReminderIsNeeded", true)){
            Log.d(TAG, "proper functioning");
        }
}

如果用户在取消提醒后重新启用提醒,则不会再次设置提醒。 Log.d 输出为 proper functioning。这是因为 walkAlarmDown 仍然给出 false。我相信这是因为取消警报时 walkAlarmDown 没有变为真。如何确保取消警报时 walkAlarmDown 应该变为真?

或者,是否因为启用了我的其他警报而保持为真?因此,只有一个警报被取消而另一个警报保持活动状态。它有一个不同的广播请求代码。所以我认为这应该不是问题。

即使取消了 alarmmanager,

walkPendingIntent 仍然有效。代码 walkAlarmManager.cancel(walkPendingIntent); 后应跟有 walkPendingIntent.cancel()。现在walkAlarmDown取消报警后会给出一个true

添加到@suku 的回答中,当您在 AlarmManager 上调用 cancel() 时,警报确实会被取消。

walkAlarmManager.cancel()

但是由于您根据待定意图的存在设置或重置警报,因此您也需要明确取消它。

尝试将周期间隔减少到 30 秒,以测试警报是否触发。 您会注意到,当您取消警报时,它确实会停止触发,但待定意图仍保持活动状态,这就是导致误报的原因。

在我看来,将您的警报管理基于未决意图的存在是有缺陷的逻辑。警报设置或重置应基于用户意图。