检查是否设置了警报管理器时出现误报
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 秒,以测试警报是否触发。
您会注意到,当您取消警报时,它确实会停止触发,但待定意图仍保持活动状态,这就是导致误报的原因。
在我看来,将您的警报管理基于未决意图的存在是有缺陷的逻辑。警报设置或重置应基于用户意图。
我有两个闹钟 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 应该变为真?
或者,是否因为启用了我的其他警报而保持为真?因此,只有一个警报被取消而另一个警报保持活动状态。它有一个不同的广播请求代码。所以我认为这应该不是问题。
walkPendingIntent
仍然有效。代码 walkAlarmManager.cancel(walkPendingIntent);
后应跟有 walkPendingIntent.cancel()
。现在walkAlarmDown
取消报警后会给出一个true
添加到@suku 的回答中,当您在 AlarmManager 上调用 cancel() 时,警报确实会被取消。
walkAlarmManager.cancel()
但是由于您根据待定意图的存在设置或重置警报,因此您也需要明确取消它。
尝试将周期间隔减少到 30 秒,以测试警报是否触发。 您会注意到,当您取消警报时,它确实会停止触发,但待定意图仍保持活动状态,这就是导致误报的原因。
在我看来,将您的警报管理基于未决意图的存在是有缺陷的逻辑。警报设置或重置应基于用户意图。