有多个警报时取消单个警报

我使用相同的pendingIntent为每个使用不同的intentId设置多个警报。 警报正在运行。 现在我要取消特定的警报。 如果我使用cancel()方法,我将最终取消所有警报。 我只想删除一个特定的。 此外,即使在第二次或第三次发射期间,用户也应该能够取消此警报。 就像我第二次启动时一样,我将不会拥有相同的pendingIntent对象。 我是否必须持久化pendingIntent对象? 如果是这样,怎么样? 以及如何从多个警报中取消单个警报?

你可以这样做,

在Pending Intent中,您可以传递unique ID来代替requestCode

 PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0); 

要取消,您可以使用相同的唯一ID取消它,使用相同的待定意图。

 am.cancel(pi); 

要获得更多信息,您可以使用StackOverflow或Google,目前我认为this answer可以帮到您。 🙂

这是一种用解释来做这件事的黑客。

首先,您应该为待定意图创建一个独特的意图。 为此,您可以为应用程序创建intent的自定义数据字段。 我这样做的方式如下:

 Intent intent = new Intent(); intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); Uri data = Uri.withAppendedPath( Uri.parse("myapp://myapp/Id/#"), String.valueOf(intentId)); intent.setData(data); 

在您的情况下, intentId将是您的意图的唯一标识符。

然后像往常一样创建alarmManager通知。 要取消闹钟,您应该执行以下步骤。 首先,您应该像上一个代码示例一样创建一个intent。 然后根据此意图创建待定意图(您还可以为警报创建相同的待处理意图)。 然后你取消这个警报:

 Intent intent = new Intent(); intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION); Uri data = Uri.withAppendedPath( Uri.parse("myapp://myapp/Id/#"), String.valueOf(intentId)); intent.setData(data); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent);