【问题标题】:Unable to dismiss/hide alarm icon on Android 5.0 Lollipop无法关闭/隐藏 Android 5.0 Lollipop 上的警报图标
【发布时间】: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


【解决方案1】:

你的问题在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);。因此,当您说“当前已从下一个警报中取消(预期结果)”时,您的断言是错误的。警报未被取消;只是它的意图被取消了。

我建议您使用 FLAG_UPDATE_CURRENT。

【讨论】:

  • 嗨!谢谢你的回答:) ...我已经通过 PendingIntent.FLAG_UPDATE_CURRENT 更改了每个 PendingIntent.FLAG_CANCEL_CURRENT 并且它现在似乎正在工作!
【解决方案2】:

我已经解决了它在我的广播呼叫中将我的 PendingIntent.FLAG_CANCEL_CURRENT 更改为 PendingIntent.FLAG_UPDATE_CURRENT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2015-05-13
    • 2017-07-07
    • 1970-01-01
    • 2015-04-08
    • 2016-10-19
    相关资源
    最近更新 更多