首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取消AlarmManager

如何取消AlarmManager
EN

Stack Overflow用户
提问于 2013-05-14 14:28:13
回答 3查看 2.9K关注 0票数 1

我已经设置了一个alarmManager,如下所示:

代码语言:javascript
复制
    Intent intent = new Intent(TopActivity.this, RecordActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    intent.putExtra(Utils.KEY_RECORD_TIME, recordLength);
    intent.putExtra(Utils.KEY_REC_START_TIME, start);

    saveTimeAndLength(start, recordLength);

    PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);

下面的代码应该可以取消它,但它总是失败。我遗漏了什么?

代码语言:javascript
复制
 AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(TopActivity.this, RecordActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra(Utils.KEY_RECORD_TIME, start);
intent.putExtra(Utils.KEY_REC_START_TIME, recordLength);

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0);
try {
    alarmManager.cancel(pintent);
    Log.e(TAG, "Cancelling all pending intents");
} catch (Exception e) {
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
}

我已经在StackOverflow上读了很多答案,但仍然不知道问题出在哪里。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-14 18:32:46

我会在这里发布我的答案,希望能帮助其他人节省一些时间。

以某种方式在两端添加标志PendingIntent.FLAG_UPDATE_CURRENT就解决了这个问题。

代码语言:javascript
复制
PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

解决了这个问题。

设置告警

代码语言:javascript
复制
 Intent intent = new Intent(TopActivity.this, RecordActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    intent.putExtra(Utils.KEY_RECORD_TIME, recordLength);
    intent.putExtra(Utils.KEY_REC_START_TIME, start);

    saveTimeAndLength(start, recordLength);

    PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);

取消报警

代码语言:javascript
复制
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(TopActivity.this, RecordActivity.class);

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
try {
    alarmManager.cancel(pintent);
    Log.e(TAG, "Cancelling all pending intents");
} catch (Exception e) {
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
}
票数 2
EN

Stack Overflow用户

发布于 2013-05-14 15:52:22

为了让AlarmManager取消一个事件,它需要比较这两个意图。

这是通过filterEquals (Intent other)方法实现的,该方法表示

确定用于意图解析(过滤)的两个意图是否相同。也就是说,如果它们的操作、数据、类型、类和类别是相同的。这不会比较意图中包含的任何额外数据。

我不确定为什么当类相同时它不匹配。

我也有同样的问题,为了克服这个问题,我也设置了一个数据。

看看这对你有没有帮助。

编辑的

在设置闹钟时

代码语言:javascript
复制
    Intent intent = new Intent(TopActivity.this, RecordActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    intent.putExtra(Utils.KEY_RECORD_TIME, recordLength);
    intent.putExtra(Utils.KEY_REC_START_TIME, start);
    intent.setData(Uri.fromParts("yourappscheme", "alarm", null)); 
    saveTimeAndLength(start, recordLength);

    PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);

当需要取消时

代码语言:javascript
复制
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(TopActivity.this, RecordActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra(Utils.KEY_RECORD_TIME, start);
intent.putExtra(Utils.KEY_REC_START_TIME, recordLength);
intent.setData(Uri.fromParts("yourappscheme", "alarm", null)); 

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0);
try {
    alarmManager.cancel(pintent);
    Log.e(TAG, "Cancelling all pending intents");
} catch (Exception e) {
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
}
票数 3
EN

Stack Overflow用户

发布于 2013-05-14 14:36:24

您需要创建您的待定意图,然后将其取消

代码语言:javascript
复制
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class);
PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);

// Cancel alarms
try {
    alarmManager.cancel(pendingUpdateIntent);
} catch (Exception e) {
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16536486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档