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

我可以从PendingIntent 获得Intent 吗?

这是场景:

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

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

【问题讨论】:

    标签: android android-intent android-pendingintent


    【解决方案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。见stackoverflow.com/q/42401911/324625
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2011-02-22
    • 2011-05-19
    • 2023-03-27
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多