【发布时间】:2015-05-16 12:17:37
【问题描述】:
自 Android Lollipop 5.0 (API21) 发布以来,现在有一个 API 可以正式显示/隐藏警报图标。 在 stackoverflow 上有更多关于这个 here 的信息。
多亏了它,我现在设法在 5.0+ 的 Android 设备上显示警报图标。不幸的是,如果警报被禁用,我无法关闭/隐藏/取消图标。
这就是我正在做的事情(Stackoverflow 和 Android 库存警报的几次尝试的混合):
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 设备,启用警报时会显示该图标,但如果您禁用它(并且没有启用其他警报),则当前会从下一个即将到来的警报中取消(预期结果),但图标仍然存在通知栏。
有人知道这个问题吗?
感谢您的帮助。
【问题讨论】:
-
这看起来是正确的,听起来像是一个错误。您是否在多个 5.x 设备上进行过测试?文档说“系统可能选择向用户显示有关此警报的信息” - 这表明它可能是硬件制造商的实现细节。
-
感谢亚当的评论。我跟着它,问了几个使用不同 5.X 设备的人尝试,都遇到了相同的结果:图标仍然显示。
-
您是否尝试过使用相同的标志来创建和取消?目前您正在使用 0 标志创建并使用
FLAG_NO_CREATE取消。 -
是的,其实我一开始也是用同一个flag,后来改成Lollipop上Android股票报警here(第43行)使用的方法
标签: android alarmmanager android-5.0-lollipop android-alarms