java - 无法取消 Android 闹钟管理器的闹钟

标签 java android broadcastreceiver alarmmanager

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

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

文档说cancel将尝试找到一个与我用“filterEquals”提供的 Intent 相匹配的 Intent (“为了 Intent 解析(过滤)的目的,确定两个 Intent 是否相同。也就是说,它们的操作、数据、类型、类和类别是否相同。这不会比较 Intent 中包含的任何额外数据。”)

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

创建警报:

    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 次取消警报,并且在创建和取消时为每个警报生成的 ID 匹配。

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

我的闹钟会触发一个广播接收器,该接收器将根据每个闹钟输出一条通知。

我忘了提及,我尝试为 PendingIntent 使用不同的标志,但没有任何效果(FLAG_CANCEL_CURRENT、FLAG_UPDATE_CURRENT)

最佳答案

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

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

可惜我没看到。

关于java - 无法取消 Android 闹钟管理器的闹钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36603459/

相关文章:

java - Android中通过socket连接到服务器

Android 服务 setInexactRepeating asyncTask 问题与 SharedPreferences

android - 如何解决错误: Not allowed to start service Intent : app is in background uid?

java - 获取Java类/对象的私有(private)属性列表

java - 如何使用 XPages Java 代码在自定义控件中设置输入控件的有效方法?

java - [更新]如何访问 json 对象中的值?

android - FindViewbyID 与 fragment

java - 处理Android的SQLiteException

android - StreamBuilder 为每次更新构建两次快照

android - java.lang.SecurityException : Permission Denial: not allowed to send broadcast android. intent.action.MEDIA_MOUNTED 仅在 KitKat 上