Intent 和 PendingIntent 区别

173 阅读2分钟

最近几天在做项目,遇到了一个问题,使用inten传送数据时,发现上报的打点数据,一直是pendingIntent第一次传递的数据,通过断点发现,数据源是正常更新的,就是在从第二次开始使用PendingIntent传送数据的时候,发现一直都是第一次数据,,由此可以确定就是Intent的数据更新机制不是实时刷新的,由此引发了对PendingIntent的学习。

PendingIntent 是对 Intent 的封装,关键的不同在于:

A组件 创建了一个 PendingIntent 的对象然后传给 B组件,B 在执行这个 PendingIntent 的 send 时候,
它里面的 Intent 会被发送出去,而接受到这个 Intent 的 C 组件会认为是 A 发的。
B 以 A 的权限和身份发送了这个 Intent

讲重点

  • FLAG_IMMUTABLE不可变标记位,将约束外部应用消费 PendingIntent 修改其中的 Intent;
  • FLAG_MUTABLE可变标记位,不约束外部应用消费 PendingIntent 修改其中的 Intent;
  • FLAG_UPDATE_CURRENT:** 更新标记位 1**,如果系统中已经存在相同的 PendingIntent,那么将保留原有 PendingIntent 对象,而更新其中的 Intent。即使不可变 PendingIntent,依然可以在当前应用更新;
  • FLAG_CANCEL_CURRENT更新标记位 2,如果系统中已经存在相同的 PendingIntent,那么将先取消原有的 PendingIntent,并重新创建新的 PendingIntent。
  • FLAG_NO_CREATE: 更新标记位 3,如果系统中已经存在相同的 PendingIntent,那么不会重新创建,而是直接返回 null;
  • FLAG_ONE_SHOT: 一次有效标记位,PendingIntent 被消费后不支持重复消费,即只能使用一次。

什么情况下会使用PendingIntent

PendingIntent 的应用场景关键在于间接的 Intent 跳转需求,  即先通过一级 Intent 跳转到某个组件,在该组件完成任务后再间接地跳转到二级的 Intent。PendingIntent 中的单词 “pending” 指延迟或挂起,就是指它是延迟的或挂起的。谷歌官网介绍的是主要在:

  1. 通知,在点击通知时执行调起本应用的操作,当然也可以执行其他操作
  2. 闹钟,定时执行某个操作
  3. 桌面小部件,点击小部件时执行某个操作
  4. 第三方应用回调操作--也就是我遇到的场景

具体的使用方法可以去看谷歌官网,我这里就不搬运了。