使用AlarmManager取消警报

时间:2017-06-15 12:37:58

标签: android alarmmanager android-notifications android-alarms

我正在开发一个提醒应用,我在其中存储了所有提醒  使用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。:我已经搜索了stackoverflow并找到了问题的解决方案,但现在没有一个适合我。

1 个答案:

答案 0 :(得分:0)

当您使用此代码PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);检查警报是否已存在时,您传递了标记PendingIntent.FLAG_NO_CREATE,如果找到了null,则返回PendingIntent.FLAG_UPDATE_CURRENT,您可以阅读更多here 。 请尝试传递getBroadcast

编辑:我尝试使用与您类似的代码安排和取消警报,它似乎有效,主要区别是传递给pendingIntent函数的意图和标志i用于获取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); } 。我使用下面的代码


        notificationIntent.setData(Uri.parse("uri to parse"));

编辑1 :我想我终于搞清楚了,经过几次测试,我注意到如果把这行代码 function(a){ a = typeof a==="undefined" ? 6 : a; }

当我安排闹钟时,取消操作不起作用,如果在取消它之前我也没有把它取出(另一方面设置额外的东西似乎没有做任何事情差)