【问题标题】:Can't cancel alarms for Android Alarm Manager无法取消 Android 警报管理器的警报
【发布时间】:2016-04-13 15:45:12
【问题描述】:

我正在尝试使用我的应用设置多个闹钟,并根据要求取消它们。

我已经阅读了很多相同的主题,并浏览了文档,但似乎它不起作用。

文档说取消将尝试找到与我提供的意图匹配的意图 'filterEquals'('确定两个意图是否相同以用于意图解析(过滤)。那是,如果它们的操作、数据、类型、类和类别相同。这不会比较意图中包含的任何额外数据。')

我提供相同的操作、数据、类型、类和类别,为什么它不起作用?

创建警报:

    AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    int interval = 30000;

    Intent intent = new Intent(getApplicationContext(), Broadcast.class);        
    intent.putExtra("alarmTime",alarmTime);
    intent.putExtra("reminder1",reminder1);
    intent.putExtra("reminder2",reminder2);
    intent.putExtra("title",title);
    intent.putExtra("message",message);
    intent.putExtra("vibrate",vibrate);
    intent.putExtra("sound",sound);
    intent.putExtra("name",name);

    //Create _id from data input. is unique
    int _id = 0;
    for (char i: name.toCharArray()){
        _id += Character.getNumericValue(i);
    }
    for (char i:title.toCharArray()){
        _id += Character.getNumericValue(i);
    }
    for (char i:message.toCharArray()){
        _id += Character.getNumericValue(i);
    }
    _id += (int) alarmTime.getTime();
    _id += (int) reminder1.getTime();
    _id += (int) reminder2.getTime();
    Log.e("ALARMS", "Creating alarm with id: "+_id);
    intent.setData(Uri.parse("custom://" + _id));
    intent.setAction(String.valueOf(_id));
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(getApplicationContext(), _id, intent, 0);

    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + interval, pendingUpdateIntent);

取消闹钟

AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getApplicationContext(), Broadcast.class);
    intent.putExtra("alarmTime",alarmTime);
    intent.putExtra("reminder1",reminder1);
    intent.putExtra("reminder2",reminder2);
    intent.putExtra("title",title);
    intent.putExtra("message",message);
    intent.putExtra("vibrate",vibrate);
    intent.putExtra("sound",sound);
    intent.putExtra("name",name);

    int _id = 0;
    for (char i:name.toCharArray()){
        _id += Character.getNumericValue(i);
    }
    for (char i:title.toCharArray()){
        _id += Character.getNumericValue(i);
    }
    for (char i:message.toCharArray()){
        _id += Character.getNumericValue(i);
    }
    _id += (int) alarmTime.getTime();
    _id += (int) reminder1.getTime();
    _id += (int) reminder2.getTime();
    intent.setData(Uri.parse("custom://" + _id));
    intent.setAction(String.valueOf(_id));
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(getApplicationContext(), _id, intent, 0);
    Log.e("ALARMS", "Cancelling alarm with id: "+_id);
    // Cancel alarms
    try {
        manager.cancel(pendingUpdateIntent);
    } catch (Exception e) {
        Log.e("ALARMS", "AlarmManager update was not canceled. " + e.toString());
    }

所以我用不同的参数调用了 3 次创建警报,所以我的 _id 每次都不同。

然后我调用了 3 次取消警报,并且在创建和取消时为每个警报生成的 ids 匹配。

所以取消运行但我的警报仍然被触发。

我的闹钟触发广播接收器,每个闹钟都会输出通知。

我忘了提到我为 PendingIntent 尝试了不同的标志,但没有一个工作(FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT)

【问题讨论】:

    标签: java android broadcastreceiver alarmmanager


    【解决方案1】:

    似乎我为警报提供了不同的日期,并且 _id 有几个数字不同(开始和结束是相同的),这导致在 _id 值不同且不起作用时调用取消。

    更改了生成 _id 的方式以排除日期(我使用 new Date() 生成的日期),但它不起作用

    糟糕,我没看到。

    【讨论】:

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