我正在使用PendingIntent
和AlarmManager
制作闹钟应用。我知道为了取消PendingIntent,你需要完全重新创建它。在我的应用程序中,就像许多其他闹钟应用程序一样,有一个警报列表,其中有一个开关可以打开/关闭每个警报。切换时,我当前重新创建PendingIntent并使用以下内容取消它:
Intent intent = new Intent(context, MyBroadcastReceiver.class);
String id = this.getId().replaceAll("[^0-9]+", "");
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, id, intent, 0);
alarmIntent.cancel();
我认为上面代码的前3行是不必要的。当我切换警报时,我可以访问自定义警报对象,其中包含id以及警报的许多其他详细信息。当我创建新的警报时,如果我将新创建的PendingIntent存储在警报对象中,我可以访问用于创建警报的PendingIntent,只需检索它并在1行中取消它,如下所示:
this.getPendingIntent().cancel();
我不必重新创建intent,获取id,或者从前面显示的代码中重新创建PendingIntent。这最终会节省时间和资源(不多,但这是一个很好的做法),所以我有几个问题:
1)将PendingIntent存储在对象中并稍后使用它而不是重新创建它有什么问题吗?这似乎是一个简单的答案,但我以前没见过有人这样做过。
2)重新创建我不知道的PendingIntent是否有优势?
谢谢!
答案 0 :(得分:2)
将PendingIntent存储在对象中并稍后使用它而不是重新创建它有什么问题吗?
假设基础Intent
没有大量有效负载(例如额外的Bitmap
),那么你应该没问题。
这似乎是一个简单的答案,但我以前没见过有人这样做过。
https://github.com/commonsguy/cw-omnibus/tree/v8.7/AlarmManager/Simple,虽然这是一个微不足道的例子。
重新创建我不知道的PendingIntent是否有优势?
适用于没有PendingIntent
的情况。你的过程不会永远存在。如果您想使用缓存的PendingIntent
作为优化,那很好,但如果需要,您需要能够创建PendingIntent
。