使用 AlarmManager 取消警报
Cancelling alarm using AlarmManager
我正在开发一个提醒应用程序,我在其中存储了所有提醒
数据库中的相关数据使用sqlite,一切正常。
问题:
当我从数据库中删除该行时,我也在尝试将
闹钟关了,但是没用,我用的是recyclerview。
请帮助我找出代码中的错误。
这是我的代码:
DataAdapter.java
dataAdapterViewHolder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int deleteRowId = context.getContentResolver().delete(RoutineContract.RoutinesEntry.CONTENT_URI,
rowSelection, rowSelectionArgs);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);
if(alertIntent != null) {
alarmManager.cancel(alertIntent);
alertIntent.cancel();
Log.e("row id", ""+rowId);
}
}
});
AddReminderActivity.java
Uri insertUri = getContentResolver().insert(RoutineContract.RoutinesEntry.CONTENT_URI, contentValues);
int rowId = Integer.parseInt(insertUri.getLastPathSegment());
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setData(insertUri);
intent.putExtra("name", name);
intent.putExtra("repeatType", repeatType);
PendingIntent alertIntent = PendingIntent.getBroadcast(this, rowId, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, dateTime.getTimeInMillis(),
pendingIntent);
P.S.: 我已经在 Whosebug 上搜索并找到了问题的解决方案,但 none 现在正在为我工作。
当您使用此代码 PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);
检查 alarmintent 是否已存在时,您传递标志 PendingIntent.FLAG_NO_CREATE
,即 returns null
如果找到一个,您可以阅读更多 here。
尝试传递 PendingIntent.FLAG_UPDATE_CURRENT
编辑:我尝试使用与您的代码类似的代码安排和取消警报,它似乎有效,主要区别在于传递给 getBroadcast
的 Intent函数和我用来获取 pendingIntent
的标志,在这两种情况下都是 FLAG_UPDATE_CURRENT
。我使用了下面的代码
public void scheduleAlarm() {
Intent notificationIntent = new Intent(mContext, ScheduledActionReceiver.class);
notificationIntent.setAction(ACTION_NOTIFICATION);
long now = System.currentTimeMillis() + 5 * 1000;
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, Constants.ALARM_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, now, pendingIntent);
}
public void removeAlarm() {
Intent notificationIntent = new Intent(mContext, ScheduledActionReceiver.class);
notificationIntent.setAction(ACTION_NOTIFICATION);
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, Constants.ALARM_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);
}
编辑 1:我想我终于弄明白了,通过更多的测试我注意到如果把这行代码
notificationIntent.setData(Uri.parse("uri to parse"));
当我安排闹钟时,如果我在取消它之前检索它时也没有放置它,取消操作将不起作用(另一方面,设置附加功能似乎没有任何区别)
我正在开发一个提醒应用程序,我在其中存储了所有提醒 数据库中的相关数据使用sqlite,一切正常。
问题:
当我从数据库中删除该行时,我也在尝试将 闹钟关了,但是没用,我用的是recyclerview。
请帮助我找出代码中的错误。
这是我的代码:
DataAdapter.java
dataAdapterViewHolder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int deleteRowId = context.getContentResolver().delete(RoutineContract.RoutinesEntry.CONTENT_URI,
rowSelection, rowSelectionArgs);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);
if(alertIntent != null) {
alarmManager.cancel(alertIntent);
alertIntent.cancel();
Log.e("row id", ""+rowId);
}
}
});
AddReminderActivity.java
Uri insertUri = getContentResolver().insert(RoutineContract.RoutinesEntry.CONTENT_URI, contentValues);
int rowId = Integer.parseInt(insertUri.getLastPathSegment());
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setData(insertUri);
intent.putExtra("name", name);
intent.putExtra("repeatType", repeatType);
PendingIntent alertIntent = PendingIntent.getBroadcast(this, rowId, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, dateTime.getTimeInMillis(),
pendingIntent);
P.S.: 我已经在 Whosebug 上搜索并找到了问题的解决方案,但 none 现在正在为我工作。
当您使用此代码 PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);
检查 alarmintent 是否已存在时,您传递标志 PendingIntent.FLAG_NO_CREATE
,即 returns null
如果找到一个,您可以阅读更多 here。
尝试传递 PendingIntent.FLAG_UPDATE_CURRENT
编辑:我尝试使用与您的代码类似的代码安排和取消警报,它似乎有效,主要区别在于传递给 getBroadcast
的 Intent函数和我用来获取 pendingIntent
的标志,在这两种情况下都是 FLAG_UPDATE_CURRENT
。我使用了下面的代码
public void scheduleAlarm() {
Intent notificationIntent = new Intent(mContext, ScheduledActionReceiver.class);
notificationIntent.setAction(ACTION_NOTIFICATION);
long now = System.currentTimeMillis() + 5 * 1000;
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, Constants.ALARM_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, now, pendingIntent);
}
public void removeAlarm() {
Intent notificationIntent = new Intent(mContext, ScheduledActionReceiver.class);
notificationIntent.setAction(ACTION_NOTIFICATION);
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, Constants.ALARM_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);
}
编辑 1:我想我终于弄明白了,通过更多的测试我注意到如果把这行代码
notificationIntent.setData(Uri.parse("uri to parse"));
当我安排闹钟时,如果我在取消它之前检索它时也没有放置它,取消操作将不起作用(另一方面,设置附加功能似乎没有任何区别)