0

在我的代码中,我创建了一个警报,如下所示:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent("mypackage.START_MONITORING_SERVICE");
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
long timeForNextStart = System.currentTimeMillis() + elapsedTime;
am.set(AlarmManager.RTC_WAKEUP, timeForNextStart, pi);

要取消警报,我这样做:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("mypackage.START_MONITORING_SERVICE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
am.cancel(pendingIntent);

我的问题是这是否是取消所有具有相同意图的警报的正确方法。文档说:

删除任何具有匹配 Intent 的警报。任何类型的任何警报,其 Intent 与此匹配(由 filterEquals(Intent) 定义)都将被取消。

我不确定是什么定义了“匹配意图”。如果我使用上面的代码创建多个警报,然后如图所示执行取消,它会取消我创建的所有警报吗?

4

3 回答 3

0

您应该使用 PendingIntent 标志 ==> PendingIntent.FLAG_CANCEL_CURRENT 第四个参数创建 pendingIntent 实例方法。

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
于 2013-10-08T05:47:53.217 回答
0

尝试这个

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

    Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class);
    PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);

    // Cancel alarms
    try {
        alarmManager.cancel(pendingUpdateIntent);
    } catch (Exception e) {
        Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
    }
于 2013-10-08T05:49:15.777 回答
0

我的问题是这是否是取消所有具有相同意图的警报的正确方法?

我不知道您是否知道 对于以下语法requestCode 应该是唯一的pendingIntent

public static PendingIntent getService (Context context, int requestCode, Intent intent, int flags)

我不确定是什么定义了“匹配意图”。

每个挂起的意图映射及其提供的触发意图和每个请求代码映射具有该意图。

requestcode我们可以说两个不同pendingIntent的,理想情况下有两个不同 的,它可以是相同的intents

记住,这里如果PendingIntent有一个相同requestCode的,intent那么它可以被覆盖或取消根据int flags

如果我使用上面的代码创建多个警报,然后如图所示执行取消,它会取消我创建的所有警报吗?

要创建多个警报,您必须requestCode使用相同的intent . 如果你想取消那些创建的警报,那么你必须根据requestCode

例如

To Create :

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
For (int i= 0 ; i <5 ; i++){
PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i,
                            new Intent(),PendingIntent.FLAG_UPDATE_CURRENT);
 alarmManager.set(AlarmManager.RTC_WAKEUP, timeForNextStart, contentIntent);

}

To cancel :

For (int i= 0 ; i <5 ; i++){
//Note here ' i ' is the requestCode which map each pendingIntent with there provided intent 
PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i,
                            new Intent(),PendingIntent.FLAG_UPDATE_CURRENT);
 alarmManager.cancel(contentIntent);

}
于 2013-10-08T06:29:01.970 回答