无法在 Android 5.0 Lollipop 上 dismiss/hide 警报图标
Unable to dismiss/hide alarm icon on Android 5.0 Lollipop
自从 Android Lollipop 5.0 (API21) 发布以来,现在有一个 API 正式 show/hide 闹钟图标。
在 Whosebug 上有关于此 的更多信息。
感谢它,我现在设法在 5.0+ Android 设备上显示警报图标。不幸的是,如果闹钟被禁用,我无法 dismiss/hide/cancel 图标。
这是我正在做的事情(结合了 Whosebug 和 Android stock alarm 的多次尝试):
public static void setNextAlert(final Context context) {
final Alarm alarm = calculateNextAlert(context);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ALARM_ALERT_ACTION);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
int flags = alarm == null ? PendingIntent.FLAG_NO_CREATE : 0;
PendingIntent operation = PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, flags);
if (alarm != null)
{
if(UtilsAlarm.isLollipopOrLater())
{
PendingIntent viewIntent = PendingIntent.getActivity(context, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager.AlarmClockInfo info = new AlarmManager.AlarmClockInfo(alarm.time, viewIntent);
am.setAlarmClock(info, operation);
}
else
{
if(UtilsAlarm.isKitKatOrLater())
{
am.setExact(AlarmManager.RTC_WAKEUP, alarm.time, sender);
}
else
{
am.set(AlarmManager.RTC_WAKEUP, alarm.time, sender);
}
setStatusBarIcon(context, true);
}
Calendar c = Calendar.getInstance();
c.setTimeInMillis(alarm.time);
String timeString = formatDayAndTime(context, c);
saveNextAlarm(context, timeString);
}
else
{
if(UtilsAlarm.isLollipopOrLater())
{
am.cancel(operation);
}
else
{
am.cancel(sender);
setStatusBarIcon(context, false);
}
saveNextAlarm(context, "");
}
Intent i = new Intent(NEXT_ALARM_TIME_SET);
context.sendBroadcast(i); }
因此,如果我们使用的是低于 Lollipop 的版本,它仍然可以正常工作。但是,对于 Lollipop 设备,该图标在启用警报时显示,但如果您禁用它(并且没有启用其他警报),它当前从下一个即将到来的警报中取消(预期结果)但该图标仍然存在通知栏。
有人知道这个问题吗?
感谢您的帮助。
你的问题在int flags = alarm == null ? PendingIntent.FLAG_NO_CREATE : 0;
行
您告诉系统将 null
分配给 PendingIntent operation
,因为上次您使用此方法时已经存在相应的意图(请参阅 FLAG_NO_CREATE 的文档)。
稍后当您调用 am.cancel(operation);
时完全没有效果,因为 operation == null
。您的警报仍在系统中注册。警报响起时没有任何反应的唯一原因是您取消了上一行中的意图(而不是警报):PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
。所以当你说 "it is currently cancelled from the next coming alarm (expected result)" 时你的断言是错误的。警报没有取消;只是它的意图被取消了。
我推荐你使用FLAG_UPDATE_CURRENT。
我已经解决了在我的广播呼叫中将我的 PendingIntent.FLAG_CANCEL_CURRENT 更改为 PendingIntent.FLAG_UPDATE_CURRENT
自从 Android Lollipop 5.0 (API21) 发布以来,现在有一个 API 正式 show/hide 闹钟图标。
在 Whosebug 上有关于此
感谢它,我现在设法在 5.0+ Android 设备上显示警报图标。不幸的是,如果闹钟被禁用,我无法 dismiss/hide/cancel 图标。
这是我正在做的事情(结合了 Whosebug 和 Android stock alarm 的多次尝试):
public static void setNextAlert(final Context context) {
final Alarm alarm = calculateNextAlert(context);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ALARM_ALERT_ACTION);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
int flags = alarm == null ? PendingIntent.FLAG_NO_CREATE : 0;
PendingIntent operation = PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, flags);
if (alarm != null)
{
if(UtilsAlarm.isLollipopOrLater())
{
PendingIntent viewIntent = PendingIntent.getActivity(context, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager.AlarmClockInfo info = new AlarmManager.AlarmClockInfo(alarm.time, viewIntent);
am.setAlarmClock(info, operation);
}
else
{
if(UtilsAlarm.isKitKatOrLater())
{
am.setExact(AlarmManager.RTC_WAKEUP, alarm.time, sender);
}
else
{
am.set(AlarmManager.RTC_WAKEUP, alarm.time, sender);
}
setStatusBarIcon(context, true);
}
Calendar c = Calendar.getInstance();
c.setTimeInMillis(alarm.time);
String timeString = formatDayAndTime(context, c);
saveNextAlarm(context, timeString);
}
else
{
if(UtilsAlarm.isLollipopOrLater())
{
am.cancel(operation);
}
else
{
am.cancel(sender);
setStatusBarIcon(context, false);
}
saveNextAlarm(context, "");
}
Intent i = new Intent(NEXT_ALARM_TIME_SET);
context.sendBroadcast(i); }
因此,如果我们使用的是低于 Lollipop 的版本,它仍然可以正常工作。但是,对于 Lollipop 设备,该图标在启用警报时显示,但如果您禁用它(并且没有启用其他警报),它当前从下一个即将到来的警报中取消(预期结果)但该图标仍然存在通知栏。
有人知道这个问题吗?
感谢您的帮助。
你的问题在int flags = alarm == null ? PendingIntent.FLAG_NO_CREATE : 0;
您告诉系统将 null
分配给 PendingIntent operation
,因为上次您使用此方法时已经存在相应的意图(请参阅 FLAG_NO_CREATE 的文档)。
稍后当您调用 am.cancel(operation);
时完全没有效果,因为 operation == null
。您的警报仍在系统中注册。警报响起时没有任何反应的唯一原因是您取消了上一行中的意图(而不是警报):PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
。所以当你说 "it is currently cancelled from the next coming alarm (expected result)" 时你的断言是错误的。警报没有取消;只是它的意图被取消了。
我推荐你使用FLAG_UPDATE_CURRENT。
我已经解决了在我的广播呼叫中将我的 PendingIntent.FLAG_CANCEL_CURRENT 更改为 PendingIntent.FLAG_UPDATE_CURRENT