无法取消重复闹钟

Cannot cancel repeating alarm

我用的是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 分钟。此警报在首选项中的复选框中设置。在 HTC One 运行 API 23 上,闹钟按预期响起。但是,当我通过取消选中首选项来取消此警报时,警报会一直响起。这是我的取消代码:

    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);
    }

我错过了什么?

您需要保留在 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);
    }
}

那么在你的 class 中的用法将类似于以下内容(这里我使用了 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;
    }
}

HTHs!!!

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

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

    }

AlarmReceived 实现为 Singleton,而 AlarmManager 在我的 setAlarm 中实例化。所以取消报警时alarmMgr为null。