无法解除/隐藏Android 5.0 Lollipop上的闹钟图标

Mat*_*ife 5 android alarmmanager android-alarms android-5.0-lollipop

自Android Lollipop 5.0(API21)发布以来,现在有一个API可以正式显示/隐藏警报图标.stackoverflow上有关于此的更多信息.

多亏了它,我设法在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); }
Run Code Online (Sandbox Code Playgroud)

因此,如果我们的版本低于Lollipop,它仍然可以正常运行.但是,对于Lollipop设备,启用警报时会显示图标,但如果您禁用它(并且没有启用其他警报),则当前会从下一个警报(预期结果)中取消该图标,但图标仍然存在于通知栏.

有人知道这个问题吗?

Thansk的帮助.

sor*_*niv 2

你的问题就在一线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。