问题 如何从PendingIntent获取Intent


我能得到吗? Intent 从一个 PendingIntent

这是场景:

  1. 我创造了一个 Intent (我们称之为 myIntent
  2. 我用字符串放了一些额外的信息(称之为 myInfo
  3. 我创造了一个 PendingIntent (myPendingIntent使用 myIntent
  4. 我用警报设置闹钟 AlarmManager 和 myPendingIntent
  5. 在稍后阶段,我会使用PendingIntent PendingIntent.getBroadcast
  6. 那时我想读 myInfo 从 myIntent 在... myPendingIntent

这可能吗?通过浏览谷歌,我接近结论,这是不可能的。


7702
2018-05-18 17:48


起源



答案:


这可能吗?

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


11
2018-05-18 17:51



如果你打电话,如果它当前由AlarmManager保存,你似乎可以得到Intent(检索最初与它一起存储的Extras) PendingIntent.getService (或者可能 .getBroadcast)同样的 requestCode 作为原始和 没有 标志,然后立即 send() 对自己的意图。是否有任何理由不应该使用此方法(在所有Android版本中它是否可靠)? - Michael
@Michael:我没有使用它,也不会使用它,所以我不能评论它的可靠性。坦率地说,我很沮丧地发现它是可能的。 - CommonsWare
好。为什么沮丧? - Michael
@迈克尔:我不喜欢安全漏洞。我以为是只写的界面了 PendingIntent 部分是为了保留底层的细节 Intent 不在第三方手中。这将被利用,但Android安全团队表示它正在按预期工作。 - CommonsWare
啊,我明白了。文档似乎确实警告说,发出PendingIntent几乎让接收者成为你的权限,因此访问Intent本身似乎是最不用担心的。 - Michael


答案:


这可能吗?

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


11
2018-05-18 17:51



如果你打电话,如果它当前由AlarmManager保存,你似乎可以得到Intent(检索最初与它一起存储的Extras) PendingIntent.getService (或者可能 .getBroadcast)同样的 requestCode 作为原始和 没有 标志,然后立即 send() 对自己的意图。是否有任何理由不应该使用此方法(在所有Android版本中它是否可靠)? - Michael
@Michael:我没有使用它,也不会使用它,所以我不能评论它的可靠性。坦率地说,我很沮丧地发现它是可能的。 - CommonsWare
好。为什么沮丧? - Michael
@迈克尔:我不喜欢安全漏洞。我以为是只写的界面了 PendingIntent 部分是为了保留底层的细节 Intent 不在第三方手中。这将被利用,但Android安全团队表示它正在按预期工作。 - CommonsWare
啊,我明白了。文档似乎确实警告说,发出PendingIntent几乎让接收者成为你的权限,因此访问Intent本身似乎是最不用担心的。 - Michael


从4.2.2开始使用反射是可能的。看看这个 回答,有完整的解决方案来获得 Intent 从 PendingIntent


3
2018-01-07 09:17



如果您尝试从intent获取Parceable包,则此解决方案将失败。 - Kristy Welsh
在较新版本的Android上,不再可能使用反射来获取Intent。看到 stackoverflow.com/q/42401911/324625 - Steve Blackwell