【问题标题】:Cannot cancel repeating alarm无法取消重复警报
【发布时间】:2016-08-31 19:56:24
【问题描述】:

我正在使用 targetSdkVersion 24。我设置了这样的警报:

    alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra("REQUEST_CODE", CHEW_REQ_CODE);
    intent.putExtra("CHEW_TEXT", chewText);
    PendingIntent pIntent = PendingIntent.getBroadcast(context, CHEW_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + interval, interval, pIntent);

其中间隔为 15 x 60 x 1000 = 15 分钟。此警报在首选项中的复选框中设置。在运行 API 23 的 HTC One 上,警报按预期响起。但是,当我通过取消选中首选项来取消此警报时,警报会一直响起。这是我的取消代码:

    if (alarmMgr != null) {
        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.putExtra("REQUEST_CODE", CHEW_REQ_CODE);
        intent.putExtra("CHEW_TEXT", chewText);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, CHEW_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmMgr.cancel(pIntent);
    }

我错过了什么?

【问题讨论】:

  • 您确定取消选中首选项时会调用该代码吗?

标签: android alarmmanager


【解决方案1】:

您需要保留在alarmMgr.setRepeating(...) 中使用的原始 PendingIntent 对象,而不是创建一个新对象。这样的事情应该会有所帮助;

PendingIntent startAlarm(Context context){
    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra("REQUEST_CODE", CHEW_REQ_CODE);
    intent.putExtra("CHEW_TEXT", chewText);
    PendingIntent pIntent = PendingIntent.getBroadcast(context, CHEW_REQ_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + interval, interval, pIntent);
    return pIntent;
}

void stopAlarm(Context context, PendingIntent pIntent) {
    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    if (alarmMgr!= null) {
        alarmMgr.cancel(pIntent);
    }
}

那么在你的类中的用法将类似于以下(这里我使用了一个 Activity 的 onPause 和 onResume):

PendingIntent alarmIntent;

@Override
protected void onResume() {
    super.onResume();
    alarmIntent = startAlarm(this);
}

@Override
protected void onPause() {
    super.onPause();
    if (alarmIntent != null) {
        stopAlarm(this, alarmIntent);
        alarmIntent = null;
    }
}

HTH!!!

【讨论】:

    【解决方案2】:

    感谢Blehi,我发现代码没有被调用。部分是这样的:

        if (alarmMgr != null) {
            alarmMgr.cancel(chewIntent);
    
        }
    

    AlarmReceived 是作为 Singleton 实现的,而 AlarmManager 是在我的 setAlarm 中实例化的。所以闹钟取消时,alarmMgr 为空。

    【讨论】:

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