我正在开发一个提醒应用程序,其中存储了所有提醒数据库中的相关数据使用SQLite,一切正常。
问题:
当我从数据库中删除该行时,我也在尝试将警报关闭,但它不起作用,我正在使用回收器视图。
请帮助我找出我的代码中的问题。
这是我的代码:
数据适配器.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);
}
}
});
添加提醒活动.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);
PS:我已经在stackoverflow上搜索并找到了解决问题的解决方案,但现在没有一个对我有用。
当您检查此代码是否已经存在警报意图时, PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);
传递标志PendingIntent.FLAG_NO_CREATE
,如果找到标志,则返回null
,您可以在此处阅读更多信息。尝试传递PendingIntent.FLAG_UPDATE_CURRENT
编辑:我尝试使用类似于您的代码安排和取消警报,它似乎有效,主要区别在于传递给getBroadcast
函数的意图和我用来获取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"));
闹钟之前检索它时不也放它,取消操作不起作用(另一方面,设置附加功能似乎没有任何区别(