【问题标题】:Getting false positive while checking whether alarm manager is set检查是否设置了警报管理器时出现误报
【发布时间】:2016-07-05 14:08:49
【问题描述】:

我有两个闹钟 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 仍然给出错误。我相信这是因为当警报被取消时 walkAlarmDown 没有变为真。取消警报时,如何确保 walkAlarmDown 变为 true?

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

【问题讨论】:

    标签: android alarmmanager android-alarms


    【解决方案1】:

    walkPendingIntent 仍然处于活动状态,即使警报管理器被取消。代码walkAlarmManager.cancel(walkPendingIntent); 后应跟walkPendingIntent.cancel()。现在walkAlarmDown会在取消报警后返回true。

    【讨论】:

    【解决方案2】:

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

    walkAlarmManager.cancel()
    

    但是由于您根据 Pending Intent 的存在设置或重置警报,因此您还需要明确取消它。

    尝试将您的周期性间隔减少到 30 秒,以测试警报的触发或不触发。 您会注意到,当您取消警报时,警报确实会停止触发,但待处理的 Intent 仍然处于活动状态,这就是导致误报的原因。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多