无法取消重复闹钟
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。
我用的是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。