当前位置: 首页 > news >正文

PendingIntent的flag和原理解析

flag

含义

PendingIntent.FLAG_CANCEL_CURRENT

如果PendingIntent已经存在,则取消当前的PendingIntent,重新创建一个新的PendingIntent。

PendingIntent.FLAG_NO_CREATE

如果PendingIntent已经存在,则返回null,而不是重新创建一个新的PendingIntent。

PendingIntent.FLAG_ONE_SHOT

只能使用一次,使用后会自动取消。

PendingIntent.FLAG_UPDATE_CURRENT

如果PendingIntent已经存在,则更新当前的PendingIntent。

PendingIntent.FLAG_IMMUTABLE

表示创建的PendingIntent应该是不可变的???

PendingIntent.FLAG_MUTABLE

表示创建的PendingIntent应该是可变的???

PendingIntentController的getIntentSender方法中

final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0;
final boolean cancelCurrent = (flags & PendingIntent.FLAG_CANCEL_CURRENT) != 0;
final boolean updateCurrent = (flags & PendingIntent.FLAG_UPDATE_CURRENT) != 0;
flags &= ~(PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_CANCEL_CURRENT| PendingIntent.FLAG_UPDATE_CURRENT);PendingIntentRecord.Key key = new PendingIntentRecord.Key(type, packageName, featureId,token, resultWho, requestCode, intents, resolvedTypes, flags,new SafeActivityOptions(opts), userId);
WeakReference<PendingIntentRecord> ref;
ref = mIntentSenderRecords.get(key);
PendingIntentRecord rec = ref != null ? ref.get() : null;
if (rec != null) {if (!cancelCurrent) {if (updateCurrent) {// FLAG_UPDATE_CURRENT标签,则更新当前的pendingIntentif (rec.key.requestIntent != null) {rec.key.requestIntent.replaceExtras(intents != null ?intents[intents.length - 1] : null);}if (intents != null) {intents[intents.length - 1] = rec.key.requestIntent;rec.key.allIntents = intents;rec.key.allResolvedTypes = resolvedTypes;} else {rec.key.allIntents = null;rec.key.allResolvedTypes = null;}}return rec;}// FLAG_CANCEL_CURRENT则先把当前的cancel掉,再重新创建一个pendingIntentmakeIntentSenderCanceled(rec, CANCEL_REASON_SUPERSEDED);mIntentSenderRecords.remove(key);decrementUidStatLocked(rec);
}
if (noCreate) {// FLAG_NO_CREATE 则直接返回当前的pendingIntentreturn rec;
}
// 重新创建一个新的
rec = new PendingIntentRecord(this, key, callingUid);

在PendingIntentRecord的sendInner中

if ((key.flags & PendingIntent.FLAG_ONE_SHOT) != 0) {// 如果是PendingIntent.FLAG_ONE_SHOT,则发送完就立刻cancel掉controller.cancelIntentSender(this, true, CANCEL_REASON_ONE_SHOT_SENT);
}

http://www.dtcms.com/a/309706.html

相关文章:

  • 【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?
  • Linux系统编程Day3-- Linux常用操作(续)
  • 【BUUCTF系列】[GXYCTF2019]Ping Ping Ping 1
  • 【Linux我做主】细说环境变量
  • 鸿蒙智能居家养老系统构思(续二)—— 适老化烹饪中心详细构思
  • 前端渲染三国杀:SSR、SPA、SSG
  • SpringBoot3.x入门到精通系列:1.4 项目结构与核心注解
  • 三十九、【扩展工具篇】Allpairspy 组合用例生成器:智能设计高效测试集
  • spring中自带的执行定时任务的注解是什么?
  • 铁皮矫平机是什么?
  • 掌握长尾关键词提升SEO
  • 4-verilog简单状态机
  • 使用mybatis生成器生成实体类mapper和查询参数文件,简单spring mvc 项目。使用log4j输出日志到控制台和文件中。使用配置文件注册Bean
  • 【U8+】删除部门的时候提示已经在总账(辅助总账)中使用,不可删除。
  • 从0到1学PHP(十三):PHP 安全编程:构建稳固的应用防线
  • (一)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • 自动化测试准备工作:概念篇
  • Java HTTPS 请求失败排查与证书导入全过程
  • 从豆瓣小组到深度洞察:一个基于Python的舆情分析爬虫实践
  • 【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)
  • JVM指针压缩的那些事
  • JVM学习日记(十三)Day13
  • C#线程同步(二)锁
  • 【工具变量大全】上市公司实证研究常用控制变量数据集(2001-2024年)
  • sqli-labs通关笔记-第26a关GET字符注入(多重关键字过滤绕过 手注法)
  • qt贝塞尔曲线演示工具
  • Product Hunt 每日热榜 | 2025-08-01
  • 5-EP4CE10F17C8-引脚配置
  • Fiddler中文版使用指南 提升开发流程的一站式抓包与调试体验
  • 大模型幻觉的本质:深度=逻辑层次,宽度=组合限制,深度为n的神经网络最多只能处理n层逻辑推理,宽度为w的网络无法区分超过w+1个复杂对象的组合