如何从PendingIntent获取Intent

19

我可以从PendingIntent获取Intent吗?

场景如下:

  1. 我创建了一个Intent(称之为myIntent
  2. 我使用一个字符串放置了一些额外的信息(称之为myInfo
  3. 我使用myIntent创建了一个PendingIntentmyPendingIntent
  4. 我使用AlarmManagermyPendingIntent设置了一个闹钟
  5. 在稍后的阶段,我使用PendingIntent.getBroadcast获得了PendingIntent
  6. 此时,我想从myPendingIntent中读取myIntent中的myInfo

这个可能吗?通过查阅谷歌,我得出的结论是不可能。

2个回答

18

是否有可能实现?

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


如果您使用与原始请求代码相同的“requestCode”并且没有标志,然后立即将意图发送给自己,似乎可以通过AlarmManager获取Intent(检索最初存储的Extras)。是否有任何理由不使用此方法(它在所有Android版本中都可靠吗)? - Michael
@Michael:我从未使用过它,也不会使用它,因此我无法评论其可靠性。坦白地说,当我发现这是可能的时,我感到非常沮丧。 - CommonsWare
@Michael:我不喜欢安全漏洞。我认为PendingIntent的只写接口部分是为了防止第三方获取底层Intent的详细信息。这将被利用,但Android安全团队表示它正在按照预期工作。 - CommonsWare
啊,我明白了。文档似乎警告说提供 PendingIntent 实际上就给了接收者成为你的权限,因此访问 Intent 本身似乎是最不用担心的事情之一。 - Michael
@Michael:您还没有看到一些开发人员放在extras中的内容。 - CommonsWare

4
自4.2.2开始,使用反射是可行的。请查看此答案,其中提供了完整的解决方案以从PendingIntent中获取Intent

如果您尝试从意图中获取一个可传递的包,那么这个解决方案将失败。 - Kristy Welsh
2
在较新版本的Android中,不再可能使用反射获取Intent。请参见https://dev59.com/6Z_ha4cB1Zd3GeqPyGd8。 - Steve Blackwell

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