安卓 - 什么是PendingIntent?

5

我刚开始学习Android开发,需要使用AlarmManager来设置重复闹钟。这是我第一次使用PendingIntent。但是在阅读文档(http://developer.android.com/reference/android/app/PendingIntent.html)后,我对PendingIntent的真正含义感到困惑。

我的问题如下:

Q1. PendingIntent为什么被称为“pending”?抱歉问这个问题,但我希望能直观地了解PendingIntent的含义。

Q2. 文档中写道:

PendingIntent本身只是一个引用,它指向系统维护的一个标记,该标记描述了用于检索它的原始数据。这意味着,即使拥有它的应用程序进程被杀死,PendingIntent本身仍然可以从已经获得它的其他进程中使用。如果创建应用程序稍后重新检索相同类型的PendingIntent(相同的操作、相同的Intent动作、数据、类别和组件以及相同的标志),则如果该标记仍然有效,它将接收表示相同标记的PendingIntent,因此可以调用cancel()来删除它。

“系统维护的一个标记,该标记描述了用于检索它的原始数据”是如何与我的代码相关联的?

pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),0,photosIntent,0);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(),
                           10000, pendingIntent);

问题3. 我也不理解文档中接下来的内容:

由于这种行为,重要的是要知道在检索pendingIntent时,何时认为两个Intent是相同的。人们常犯的一个错误是创建多个PendingIntent对象,这些对象的Intent只有其“额外”内容不同,期望每次都会得到不同的PendingIntent。但实际上并不会发生这种情况。用于匹配的Intent部分是由Intent.filterEquals定义的部分。如果您使用的两个Intent对象根据Intent.filterEquals是相等的,则您将为它们获得相同的PendingIntent。

额外内容指什么? 这是否指getBroadcast(Context context, int requestCode, Intent intent, int flags)方法中的请求代码(request code)标志(flags)参数?

希望能得到任何关于此的帮助。我在网上的搜索并没有给我想要的答案。同时感谢您花费时间。


1
这可能会有所帮助:https://dev59.com/kHE85IYBdhLWcg3wYSVk - SMR
1个回答

3

问题1 - 它是以何种方式处于“挂起”状态?

系统存储您存储在 PendingIntent 中的值,并允许您(或框架的另一部分)稍后查找它们,就像查找它们的组件自发创建了一个新的 Intent 并带有该信息。

问题2 - “引用令牌”如何与我的代码相关?

Android Framework 实际上不会存储您创建的 PendingIntent 对象;它对意图的“标识信息”进行哈希处理(在本例中为操作、数据、类型、类和类别),并使用它来查找其余信息。您创建的文字 PendingIntent 对象不会被保存,它所代表的信息会被保存。

问题3 - 什么是“额外内容”?

这里所指的“extras”是您通过 putExtra() 存储的可包装项。requestCode 和 flags 值也会被保存和检索,但当文档提到“extras”时,它指的是 Intent 可用于携带其他信息的文字 getExtras() Bundle。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接