位置: 编程技术 - 正文

Android IntentFilter 匹配原则浅析

编辑:rootadmin
Android IntentFilter 匹配原则浅析 (-- ::)转载▼标签: android intentfilter 匹配原则 it分类: android基础

推荐整理分享Android IntentFilter 匹配原则浅析,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

1 Intent分为两大类,显式和隐式。

显式事件,就是指通过 component Name 属性,明确指定了目标组件的事件。

比如我们新建一个Intent,指名道姓的说,此事件用于启动名为"com.silenceburn.XXXX”的Activity,那么这就是一个显式事件。

隐式事件,就是指没有 component Name 属性,没有明确指定目标组件的事件。

比如系统向所有监控通话情况的程序发送的“来电话了!”的事件,由于系统不确定谁会处理这个事件,因此系统不会明确指定目标组件,也就是说没有目标组件,那么这就是个隐式的事件。

此处只是简介显式和隐式事件,更精确详细的描述请查阅SDK文档,我们只需要记住一点,两种事件的最大区别是 component Name 属性是否为空。

2 事件过滤策略 和 IntentFilter

系统在传送显式事件时非常方便,因为如果把Intent比作一封信,那么component Name就是一个详细的收件人地址,系统可以精确的把显式事件送达目标组件。

而传送隐式事件时,就比较麻烦了。因为这封信的信封上,没有写收信地址!

那怎么办呢?系统做了一个艰难的决定,就是把信拆开看看。通过信件内容里面的线索,去寻找合适的收件人。

比如信中的线索描述到:“收信人是男性,快岁了,未婚,喜欢玩游戏”,那么系统就在小区里面去找这样的人。

非常&#;得庆幸的事情是,这个小区的人素质非常高,每户人家都写了点自我介绍在门口,

比如张三写道:“我是男性,后,未婚,喜欢玩游戏”,李四写道:“我是女性,快岁了,未婚,喜欢逛街”等等等等。

有了每户人家的自我介绍,系统就能很快的定位真正的收件人了!

上面是一个类比的例子,不过android系统处理隐式事件的策略,基本上就是上述这种模式了。

首先系统会通过观察Intent的内容(打开信件看内容),取得匹配线索,系统所需的线索是如下三种 :

action

data (both URI and data type)

category

其次,系统中每个组件,如果想收取隐式事件,则必须声明自己的IntentFilter(自我介绍,我对什么样的信件感兴趣)。

至于怎么写IntentFilter,已经相当明了了,那就是应该是这样写:

"我是组件XXXX,我想要接收这样的隐式事件:它的ACTION必须是 XXX,它的 category 必须是 YYYY ,它包含的data必须是ZZZZ "

如果组件不声明IntentFilter,那么所有的隐式事件都不会发送给该组件。(注意,这并不影响向该组件发送显式事件。)

对于系统中发生的每个隐式事件,系统都会尝试将 action, data , category 和系统中各个组件声明的IntentFilter 去进行匹配,以找到合适的接收者。

Android IntentFilter 匹配原则浅析

3.IntentFilter匹配原则

对于显式事件,系统可以精确送达。对于隐式事件,系统分析事件的 action, data , category 内容,并和各个组件声明的IntentFilter进行匹配,找出匹配的组件进行送达。action和category没什么好说的,再此我将最复杂的data匹配展开来进行描述一下:

首先务必认识到,data是一个相对复杂的要素。

data由URI来描述和定位,URI由三部分组成,

模式://主机:端口/路径

此外在事件中,还可以设置data的MIME类型,作为事件的datatype属性。为了描述方便,下文将IntentFilter简写为filter,请大家注意。

首先明确一个匹配原则,就是对于URI的匹配,只比较filter中声明的部分。

部分匹配原则:只要filter中声明的部分匹配成功,就认为整个URI匹配成功。

举例来说, 是可以匹配的。

注意filter中并没有定义path部分,但是依然可以匹配成功,因为filter不声明的部分不进行比较。

换句话讲,任何符合 如果data的URI和datatype为空,则 filter 的URI和type也必须为空,才能匹配成功

2. 如果data的URI不为空,但是datatype为空,则 filter 必须定义URI并匹配成功,且type为空,才能匹配成功

3. 如果data的URI为空,但是datatype不为空,则 filter 必须URI为空,定义type并匹配成功,才能匹配成功

4. 如果data的URI和data都不为空,则 filter 的URI和type都必须定义并匹配成功,才能匹配成功。对于URI部分,有一个特殊处理,就是即使filter没有定义URI,content和file两种URI也作为既存的URI存在。

通过上文的描述,大家就可以明白为什么在注册SD卡插拔接收器时,不但需要

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);

intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);

intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);

intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);

intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);

intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);

而且需要添加

intentFilter.addDataScheme("file");

注册应用安装卸载事件时不但需要

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);

intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);

intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);

而且需要

intentFilter.addDataScheme("package");

原因就在Data的匹配。

ACRA用法详解 一、什么是ACRAACRA全称:ApplicationCrashReportforAndroid.顾名思义,ACRA是一个优秀的Android异常日志收集的开源框架.利用他可以轻松的实现AndroidAPP异常日志的收集

获取手机信息的工具类 获取手机各项信息,注释很全[java]viewplaincopy/***用于获取电话信息*@authorlxj*需要加入权限uses-permissionandroid:name=android.permission.READ_PHONE_STATE/*/publicclassPhoneInfo

Android客户端通过socket与服务器通信 下面是一个demo,Android客户端通过socket与服务器通信。由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI

标签: Android IntentFilter 匹配原则浅析

本文链接地址:https://www.jiuchutong.com/biancheng/385172.html 转载请保留说明!

上一篇:Android开发秘籍学习笔记(六)(安卓开发常用代码)

下一篇:ACRA用法详解(acrag)

  • 增值税率和征收率
  • 小规模水利基金优惠政策2023
  • 劳务公司计税税率
  • 二手车没有发票能过户吗
  • 营改增后企业所得税怎么算
  • 降低企业成本的有效途径
  • 学生是纳税人吗为什么
  • 建筑业会计科目工程结算
  • 供热企业不得抵扣的进项计算
  • 电子凭证是否具有法律效力
  • 员工缴纳的工会会费可以税前扣除吗
  • 加税点开专票合适吗
  • 支付保安公司的钱违法吗
  • 运输增值税专票含税价怎么算
  • 出口免费样品发票怎么开
  • 待处理财产损益科目
  • 关于企业所得税若干优惠政策的通知
  • 存货的损失计入什么科目
  • 一次还本付息摊余成本计算公式
  • 财务费用中的利息收入指什么
  • 增值税各科目账务处理
  • 税率调整后合同金额变更案例
  • 高新加计扣除怎么做账
  • 收据可以入账的范围
  • 保安费用分录
  • 如何设置win7系统密码
  • 认缴出资怎么记账
  • 建筑劳务公司的成本有哪些,怎么做账
  • 母公司给子公司拨款要交税吗
  • 怎么升级鸿蒙系统3.1
  • linux中php的作用
  • php的数组函数
  • 销售过程的主要内容
  • 企业租用个人房屋
  • 在Windowsserver2019环境下,配置IP地址使用
  • yii框架安装
  • 浏览器分析
  • 【综述】分子预训练模型综述
  • 好用的移动端ui框架
  • 日本蜡烛图形
  • ChatGPT全面升级,GPT4支持多模态数据。
  • 产成品和库存商品两个一级科目怎么填
  • 股东之间股权转让需要股东会决议吗
  • 供应商退回多余货款账户可以是打款账号吗
  • 高价值配件用入固定资产吗
  • 金融企业往来支出属于费用吗
  • 利润表的格式分为哪几种
  • 个企年报怎么申报
  • 交通运输增值税专票
  • python报错怎么办
  • 帝国cms吧
  • 年总资产平均余额是什么
  • 技术人员的工资计入什么费用
  • 固定资产清理的账务处理
  • 个人所得税专项扣除2023最新政策
  • 免征增值税的会计处理
  • 用友t6反记账步骤
  • 小规模纳税人销售不动产适用税率
  • 报销差旅费大于预借差旅费会计分录
  • 赠送的商品如何入账
  • 单位的对公账户有利息吗
  • 辅助生产车间的制造费用不通过制造费用核算
  • 怎样申请开发票
  • 超市卡发票可以作为费用吗
  • 非公司员工可以发提成吗
  • 预提费用如何预提
  • 税金及附加科目余额在借方还是贷方
  • win7系统怎么设置屏幕常亮
  • 学会这8个技巧让你做出的菜味道更好
  • 安卓手机屏幕不好使了怎么办
  • perl中sub
  • 注册表危险组件怎么安装
  • Unity3D中的事件处理
  • fw开发
  • Rotate object with mouse click or touch in Unity3D
  • 别踩白块世界纪录视频
  • 国家审计署查民营企业
  • 税务暂停办理业务通知
  • 什么是党建工作一体化
  • 无锡市社保局电话是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设