【问题标题】:Delete specific ALARM from AlarmManger in Android从 Android 中的 AlarmManger 中删除特定的 ALARM
【发布时间】:2015-05-07 20:43:26
【问题描述】:

我正在使用alarmManger 构建一个提醒应用,但我不知道如何删除特定的闹钟。

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);

Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
manager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);

Receiver是一个普通的简单的Receiver。

我的问题是我想编辑/删除已添加的警报。 我从概念上知道如何remove an alarm,但是当添加了多个警报时,我无法删除 alarmManger 中的特定警报。

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

    通过您在警报管理器中设置的 ID,您可以在代码中访问特定警报:

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 10);
    calendar.set(Calendar.MINUTE, 30);
    
    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
    

    在这一行选择ID彼此分开,然后你可以通过它的id得到特定的警报

    PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), ID, intent, 0);
    manager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
    

    【讨论】:

    • 非常感谢 :)。如何设置不同的 ID 并获取不同警报的 ID?
    • 您可以在创建新警报时将 ids 保存在数据库中,然后通过其 id 编辑或删除它
    • 我该如何设置id?我不能只扔一个数字
    • 您可以使用 System.currentTimeMillis() 作为 ID 并将其存储在您的数据库中
    • 你能帮我解决这个问题吗stackoverflow.com/questions/51542099/…@MHP
    【解决方案2】:

    您必须为 PendingIntent 设置唯一的 requestCode :

    设置:

    PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
                11111, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    

    取消:

    PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
                11111, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.cancel(pendingIntent);
    

    【讨论】:

    • 非常感谢 :)。如何设置不同的 ID 并获取不同警报的 ID?
    【解决方案3】:

    您需要有一个唯一的 ID (requestCode),特定于您要取消的警报。我称该 ID customId。将该 id 传递给您的意图(而不是像您当前那样传递 0)。

    PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), customId, intent, 0);
    

    根据需要存储 customId,但您可以稍后使用标志 PendingIntent.FLAG_UPDATE_CURRENT 获取警报:

    PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), customId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    

    然后你就可以对alarmIntent做你想做的事了。在您的代码中,您的警报管理器称为manager,因此您可以调用:

    manager.cancel(alarmIntent);
    

    【讨论】:

    • 我已经在上面尝试过,设置警报正在工作并且还显示通知,但删除会导致所有警报被删除。我通过断点调试检查了我的列表项值始终是唯一的 wrt 位置。 gist here请看我的方法。
    【解决方案4】:

    当取消 AlarmManager 时,不要使用带有 FLAG_CANCEL_CURRENT 标志的 PendingIntent。相反,取消警报后显式取消 PendingIntent:

    am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
    Intent i = new Intent(getApplicationContext(),AlarmReceiver.class);
    PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
    am.cancel(p); p.cancel();`
    

    【讨论】:

    • 其实不用打p.cancel()。您只需要am.cancel(p)。此外,使用或不使用FLAG_CANCEL_CURRENT 严格用于更新或删除与 PendingIntent 关联的 Intent extras。看到这个:stackoverflow.com/questions/14029400/…
    • 是的,PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alert.idAlert, intent, PendingIntent.FLAG_UPDATE_CURRENT) PendingIntent.FLAG_CANCEL_CURRENT
    • 话虽如此,如果你创建一个带有使用FLAG_CANCEL_CURRENT的PendingIntent的警报,你必须在取消警报时再次使用它。
    • 从不在处理警报使用的 PendingIntent 时使用 FLAG_CANCEL_CURRENT。有关详细信息,请参阅stackoverflow.com/questions/14029400/…
    • 我已经在上面尝试过,设置警报正在工作并且还显示通知,但删除会导致所有警报被删除。我通过断点调试检查了我的列表项值始终是唯一的 wrt 位置。我也试过添加p.cancel();gist here请看看我的方法。
    【解决方案5】:

    这很简单。只需在为每个警报创建待定意图时提供特定的请求代码即可。like PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 你的具体代码例如 1001, intent, 0);

    当您想删除警报时,只需使用该特定代码创建一个待处理的意图并取消它。 PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 您的具体代码,例如 1001, intent, 0); alarmMgr.cancel(alarmIntent);

    希望对你有帮助。

    【讨论】:

    • 非常感谢 :)。如何设置不同的 ID 并获取不同警报的 ID?
    • 欢迎您。如果您要设置多个警报,则将这些警报设置在一个循环中,并将循环计数器用作待处理意图中的请求代码。当您要删除时,请使用相同的逻辑。再次开始一个循环。并在未决意图中使用计数器作为请求代码。但要注意一件事,即两者的逻辑应该相同。
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多