【问题标题】:How to cancel alarm from AlarmManager如何从 AlarmManager 取消警报
【发布时间】:2015-03-08 02:46:03
【问题描述】:

我也遇到过类似的问题。 Delete alarm from AlarmManager using cancel() - Android

" 我正在尝试以两种不同的方法创建和删除警报,这两种方法都在应用程序的不同时刻调用。逻辑。

但是,当我调用 AlarmManager 的 cancel() 方法时,警报并没有被删除。"

为了设置:

            Intent myIntent = new Intent(getApplicationContext(),
                    SessionReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    getApplicationContext(), 1, myIntent, 0);

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

            alarmManager.set(AlarmManager.RTC, now.getTimeInMillis(),
                    pendingIntent);

为了删除:

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent myIntent = new Intent(getApplicationContext(),
            SessionReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.cancel(pendingIntent);

但这不会删除已注册的警报。 提前致谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    PendingIntent 需要完全按照启动 AlarmManager 时的方式创建,看起来主要问题是您使用了不同的 requestCode(零而不是一)。

    为了快速修复,这应该可以:

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                     getApplicationContext(), 1, myIntent, 0);
    
    alarmManager.cancel(pendingIntent);
    

    为了使用PendingIntent.FLAG_UPDATE_CURRENT标志,见下文:

    设置:

    Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                    getApplicationContext(), 1, myIntent, 
                                    PendingIntent.FLAG_UPDATE_CURRENT);
    
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    alarmManager.set(AlarmManager.RTC, now.getTimeInMillis(), pendingIntent);
    

    取消:

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                    getApplicationContext(), 1, myIntent, 
                                    PendingIntent.FLAG_UPDATE_CURRENT);
    
    alarmManager.cancel(pendingIntent);
    

    【讨论】:

    • 哦。我看到了问题。我应该使用相同的 requestCode !非常感谢您的帮助,
    • 你能帮我解决吗stackoverflow.com/questions/51542099/…@DanielNugent
    • 为什么谷歌没有实现 AlarmManager.cancel(int requestCode) ?然后操作系统从底层细节(例如应用程序命名空间)处理其余部分。当然会是一个更加用户友好的 API
    • 所以基本上 requestCode 是警报的标识符?
    • 否:requestCode 不是警报的标识符。 PendingIntent 是标识符,requestCode 是 PendingIntent 的 key props 的一部分(以及底层 Intent 本身,它有自己的标识键)。
    【解决方案2】:

    最初对我来说也没有用,在看到很多帖子后,我意识到要取消的待处理意图应该与用于安排警报的原始待处理意图相同。 要取消的待定意图应该设置为相同的操作和相同的数据字段,如果有的话用于设置警报。在设置相同的操作和数据值后,虽然我没有使用它们,只取消了警报。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多