使用警报管理器取消警报



我正在开发一个提醒应用程序,其中存储了所有提醒数据库中的相关数据使用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"));

当我安排闹钟时,如果我在取消

闹钟之前检索它时不也放它,取消操作不起作用(另一方面,设置附加功能似乎没有任何区别(

最新更新