仅删除已删除警报的AlarmManager警报

时间:2012-09-25 05:17:16

标签: android android-alarms

我的应用会同时设置多个闹钟。不幸的是,每个警报都使用相同的PendingIntent对象进行设置。这是我用来设置闹钟的代码:

//Use AlarmManager to trigger the notification/alarm.
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

//PendingIntent to launch activity when the alarm triggers.                    
Intent i = new Intent("com.testapp.DisplayNotification");

//Assign the reminder's primary key as the notification ID.
i.putExtra("Reminder_Name", editRemindMeTo.getText().toString());
i.putExtra("Reminder_Primary_Key", reminderPrimaryKey);

PendingIntent displayIntent = PendingIntent.getActivity(
getBaseContext(), 0, i, 0);               

//Set the alarm to trigger.
alarmManager.set(AlarmManager.RTC_WAKEUP, 
c.getTimeInMillis(), displayIntent);

我知道我可以使用以下代码删除警报:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

Intent i = new Intent(context, MyPendingIntentService.class);
PendingIntent displayIntent = PendingIntent.getService(context, 0, i, 0);

alarmManager.cancel(displyIntent);

然而,使用此代码将删除我的所有警报(如果我在这里错了,请纠正我)。有没有办法删除只是用户已从数据库中删除的警报?在用户删除应用程序数据库中的警报条目后,应立即从我的应用程序中删除警报。我猜测使用不同的PendingIntent名称是可行的方法,但我不知道如何为用户创建的每个新警报执行此操作。关于如何做到这一点的想法?谢谢!

3 个答案:

答案 0 :(得分:4)

看到我之前遇到的同样问题...... 因此,解决方案是将唯一的未决意图传递给警报服务..所以我在这里可以做到这一点

  

PendingIntent pIntent = PendingIntent.getBroadcast(context,(int)alarm_id ,intent,PendingIntent.FLAG_CANCEL_CURRENT);

此处处于待定意图中,我已将唯一请求ID传递给待处理的意图。在取消闹钟时你必须记住这一点。 所以在我的情况下,我做了什么来生成唯一的id是把它放在数据库中我检索了表行的id并传递给挂起的Intent。
因此,如果要取消特定警报,则必须使用相同的表条目记住待处理意图的相同请求ID ...

我相信它会起作用..

答案 1 :(得分:2)

注册每个警报时使用不同的requestCode。这是PendingIntent.getActivity/Service()的第二个参数。

答案 2 :(得分:1)

在Android文档中,cancel()将取消具有相同pendingIntent的所有警报。所以唯一的出路是创建不同的pendingIntents。或者你可以使用调度重复警报,这样你就可以使用相同的pendingIntents。