如何从 PendingIntent 中获取 Intent

Posted

技术标签:

【中文标题】如何从 PendingIntent 中获取 Intent【英文标题】:How to get Intent from PendingIntent 【发布时间】:2014-07-06 15:54:46 【问题描述】:

我可以从PendingIntent 获得Intent 吗?

这是场景:

    我创建了一个Intent(我们称之为myIntent) 我用字符串添加了一些额外信息(称之为myInfo) 我使用myIntent 创建了一个PendingIntent (myPendingIntent) 我使用AlarmManagermyPendingIntent 设置了一个闹钟 在稍后阶段,我使用 PendingIntent.getBroadcast 获取 PendingIntent 那时我想从myIntent 中读取myInfo,它位于myPendingIntent

这可能吗?通过环顾 Google,我接近得出结论,这是不可能的。

【问题讨论】:

【参考方案1】:

这可能吗?

不。 PendingIntent 是一个只写接口。可以替换Intent,但是不能读取。

【讨论】:

如果您使用相同的requestCode 调用PendingIntent.getService(或者可能是.getBroadcast),如果当前由AlarmManager 持有,您似乎可以获得Intent(检索最初存储的Extras)作为原始和 no 标志,然后立即send() 对自己的意图。有什么理由不应该使用这种方法(它在所有 android 版本中都可靠吗)? @Michael:我没用过也不会用,所以我不能评论它的可靠性。坦率地说,我很沮丧地发现这是可能的。 @Michael:我不喜欢安全漏洞。我认为PendingIntent 的只写接口部分是为了使底层Intent 的细节不被第三方控制。这将被利用,但 Android 安全团队表示它正在按预期工作。 啊,我明白了。文档似乎确实警告说,发出 PendingIntent 几乎可以让接收者成为您,因此访问 Intent 本身似乎是一个人最不担心的事情。 @Michael:你似乎还没有看到一些开发人员在附加组件中添加了什么。【参考方案2】:

从 4.2.2 开始可以使用反射。看看这个answer,有完整的解决方案从PendingIntent获取Intent

【讨论】:

如果您尝试从意图中获取 Parceable 捆绑包,此解决方案将失败。 在较新版本的 Android 上,不再可能使用反射获取 Intent。见***.com/q/42401911/324625

以上是关于如何从 PendingIntent 中获取 Intent的主要内容,如果未能解决你的问题,请参考以下文章

Android中pendingIntent的深入理解

Android中pendingIntent的深入理解

Android中pendingIntent的深入理解

获取有关 PendingIntent 的 Intent 的详细信息

如何获取和取消 PendingIntent?

Android中pendingIntent的深入理解