无法关闭/隐藏Android 5.0棒棒糖上的报警图标

无法关闭/隐藏Android 5.0棒棒糖上的报警图标,android,alarmmanager,android-5.0-lollipop,android-alarms,Android,Alarmmanager,Android 5.0 Lollipop,Android Alarms,自从Android棒棒糖5.0(API21)发布以来,现在有了一个API来正式显示/隐藏报警图标。 有关stackoverflow的更多信息 多亏了它,我现在能够在5.0+Android设备上显示报警图标。不幸的是,如果报警被禁用,我不能关闭/隐藏/取消图标 下面是我正在做的(Stackoverflow和Android stock alarm的几次尝试的混合): 所以,如果我们的版本低于棒棒糖,它仍然工作得很好。但是,对于棒棒糖设备,启用报警时会显示图标,但如果禁用该图标(并且没有启用其他报警)

自从Android棒棒糖5.0(API21)发布以来,现在有了一个API来正式显示/隐藏报警图标。 有关stackoverflow的更多信息

多亏了它,我现在能够在5.0+Android设备上显示报警图标。不幸的是,如果报警被禁用,我不能关闭/隐藏/取消图标

下面是我正在做的(Stackoverflow和Android stock alarm的几次尝试的混合):

所以,如果我们的版本低于棒棒糖,它仍然工作得很好。但是,对于棒棒糖设备,启用报警时会显示图标,但如果禁用该图标(并且没有启用其他报警),则当前会从下一个报警(预期结果)中取消该图标,但该图标仍显示在通知栏上

有人知道这个问题吗


谢谢你的帮助。

你的问题在
int flags=alarm==null?pendingent.FLAG_NO_CREATE:0

您正在告诉系统将
null
分配给
pendingent操作
,因为您使用此方法之前已经存在相应的意图(有关详细信息,请参阅文档)

稍后调用
am.cancel(操作)操作==null
,所以代码>完全无效。您的警报仍在系统中注册。警报响起时没有发生任何事情的唯一原因是您取消了前一行中的意图(而不是警报):
pendingent sender=pendingent.getBroadcast(context,0,intent,pendingent.FLAG_CANCEL_CURRENT)。因此,当您说“它当前已从下一个警报(预期结果)中取消”时,您的断言是错误的。警报没有取消;只是它的意图被取消了


我建议您使用FLAG\u UPDATE\u CURRENT。

我已经解决了在广播呼叫中将pendingent.FLAG\u CANCEL\u CURRENT更改为pendingent.FLAG\u UPDATE\u CURRENT的问题。

这看起来正确,听起来像是个bug。您是否在多台5.x设备上进行过测试?文档中说“系统可能会选择向用户显示有关此警报的信息”-这向我表明这可能是硬件制造商的一个实施细节。感谢Adam的评论。我跟随它,让几个使用不同5.X设备的人尝试,结果都是一样的:图标仍然显示。您是否尝试过在创建和取消时使用相同的标志?目前,您正在使用0标志创建,并使用
标志\u NO\u CREATE
取消。是的,事实上,我最初使用的是相同的标志,然后更改为棒棒糖(第43行)上的Android stock alarm中使用的方法嗨!谢谢你的回答:)。。。我已经通过PendingEvent.FLAG\u UPDATE\u CURRENT更改了每个PendingEvent.FLAG\u CANCEL\u CURRENT,它现在似乎正在工作!
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); }