如何检查 AlarmManager 是否设置了 FLAG_ONE_SHOT 的警报
How do I check if AlarmManager has an alarm set with FLAG_ONE_SHOT
如果我创建一个 FLAG_ONE_SHOT 的 PendingIntent,随后的 FLAG_NO_CREATE returns null.
PendingIntent
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context,AlarmService.class);
PendingIntent pi = PendingIntent.getService(context,this.getId(),intent,PendingIntent.FLAG_ON_SHOT);
GregorianCalendar alarmtime = new GregorianCalendar(now.get(GregorianCalendar.YEAR),now.get(GregorianCalendar.MONTH),now.get(GregorianCalendar.DAY_OF_MONTH),0,0);
//Set the alarm
if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT) {
am.set(AlarmManager.RTC_WAKEUP,alarmtime.getTimeInMillis(), pi);
} else {
am.setExact(AlarmManager.RTC_WAKEUP, alarmtime.getTimeInMillis(), pi);
}
//Now check if the alarm was set, if it was set, the following PendingIntent should return not null but it doesn't
PendingIntent piCheck = PendingIntent.getService(context,this.getId(),intent,PendingIntent.FLAG_NO_CREATE);
if (piCheck!=null) {
Log.d(TAG,"piCheck returned NOT NULL and probably returned pi");
} else if (piCheck==null) {
Log.d(TAG,"piCheck returned NULL pi does not exist");
但是,如果我将第一个未决意图更改为:
PendingIntent pi = PendingIntent.getService(context,this.getId(),intent,PendingIntent.FLAG_CANCEL_CURRENT);
然后我的第二个 PendingIntent returns 不像预期的那样为空。
两个 PendingIntents 都正确设置了警报,但我无法 "check" FLAG_ONE_SHOT PendingIntent。这种行为的原因是什么?它的目的是什么?
我创建了一个小测试程序来验证此行为。如果您使用 FLAG_ONE_SHOT
创建一个 PendingIntent
然后将其传递给 AlarmManager
,它看起来像 Android "consumes" 立即 PendingIntent
这样它不再存在(因为是"one-shot",只能使用一次)。我本以为这会在警报实际触发时发生,但看起来并非如此。
你每天都能学到新东西:-)
为了解决您的问题,我将删除 FLAG_ONE_SHOT
,因为您可能不需要它(只需将 0
作为 "flags" 参数传递)。如果您多次设置闹钟,并且每次设置的闹钟都有不同的额外功能,则可以使用 FLAG_UPDATE_CURRENT
(但看起来您没有使用任何额外功能,所以您可能不需要这个)。我认为您不需要 FLAG_ONE_SHOT
来完成您想要做的事情。
这里出现问题是因为 FLAG_ONE_SHOT
描述 PendingIntent
因此需要识别它。
您可以使用 FLAG_ONE_SHOT | FLAG_NO_CREATE
检查它是否存在。
您的代码片段实质上是在检查不存在的不同 PendingIntent
(一个没有 FLAG_ONE_SHOT
),因此您得到 null
.
您也可以使用 FLAG_IMMUTABLE
进行尝试,这是描述所请求的 PendingIntent
.
的另一个标志
我不认为涉及警报。
如果我创建一个 FLAG_ONE_SHOT 的 PendingIntent,随后的 FLAG_NO_CREATE returns null.
PendingIntent AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context,AlarmService.class);
PendingIntent pi = PendingIntent.getService(context,this.getId(),intent,PendingIntent.FLAG_ON_SHOT);
GregorianCalendar alarmtime = new GregorianCalendar(now.get(GregorianCalendar.YEAR),now.get(GregorianCalendar.MONTH),now.get(GregorianCalendar.DAY_OF_MONTH),0,0);
//Set the alarm
if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT) {
am.set(AlarmManager.RTC_WAKEUP,alarmtime.getTimeInMillis(), pi);
} else {
am.setExact(AlarmManager.RTC_WAKEUP, alarmtime.getTimeInMillis(), pi);
}
//Now check if the alarm was set, if it was set, the following PendingIntent should return not null but it doesn't
PendingIntent piCheck = PendingIntent.getService(context,this.getId(),intent,PendingIntent.FLAG_NO_CREATE);
if (piCheck!=null) {
Log.d(TAG,"piCheck returned NOT NULL and probably returned pi");
} else if (piCheck==null) {
Log.d(TAG,"piCheck returned NULL pi does not exist");
但是,如果我将第一个未决意图更改为:
PendingIntent pi = PendingIntent.getService(context,this.getId(),intent,PendingIntent.FLAG_CANCEL_CURRENT);
然后我的第二个 PendingIntent returns 不像预期的那样为空。
两个 PendingIntents 都正确设置了警报,但我无法 "check" FLAG_ONE_SHOT PendingIntent。这种行为的原因是什么?它的目的是什么?
我创建了一个小测试程序来验证此行为。如果您使用 FLAG_ONE_SHOT
创建一个 PendingIntent
然后将其传递给 AlarmManager
,它看起来像 Android "consumes" 立即 PendingIntent
这样它不再存在(因为是"one-shot",只能使用一次)。我本以为这会在警报实际触发时发生,但看起来并非如此。
你每天都能学到新东西:-)
为了解决您的问题,我将删除 FLAG_ONE_SHOT
,因为您可能不需要它(只需将 0
作为 "flags" 参数传递)。如果您多次设置闹钟,并且每次设置的闹钟都有不同的额外功能,则可以使用 FLAG_UPDATE_CURRENT
(但看起来您没有使用任何额外功能,所以您可能不需要这个)。我认为您不需要 FLAG_ONE_SHOT
来完成您想要做的事情。
这里出现问题是因为 FLAG_ONE_SHOT
描述 PendingIntent
因此需要识别它。
您可以使用 FLAG_ONE_SHOT | FLAG_NO_CREATE
检查它是否存在。
您的代码片段实质上是在检查不存在的不同 PendingIntent
(一个没有 FLAG_ONE_SHOT
),因此您得到 null
.
您也可以使用 FLAG_IMMUTABLE
进行尝试,这是描述所请求的 PendingIntent
.
我不认为涉及警报。