IntentFilter的匹配规则

  • 原则上一个Intent不应该既是显示调用又是隐式调用,如果二者共存的话以显式调用为主
  • 隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity
  • IntentFilter中的过滤信息有action、category、data
  • 为了匹配过滤列表,需要同时匹配过滤列表中的action、category、data信息,否则匹配失败
  • 一个过滤列表中的action、category和data可以有多个,所有的action、category、data分别构成不同类别,同一类别的信息共同约束当前类别的匹配过程
  • 一个Activity可以有多个IntentFilter,只要intent能匹配任意一组就能启动

action的匹配规则

  • 允许用户自定义,必须存在
  • 要求intent中的action存在且必须和过滤规则中的其中一个action完全相同
  • action区分大小写

category的匹配规则

  • 允许用户自定义,可以不存在
  • 它和action的匹配规则不一样
  • 如果intent中含有category,那么所有的category都必须和过滤规则中的一个category相同
  • 换句话说,如果intent出现category,那么不管有几个,对于每个来说,它必须是过滤规则中已经定义的
  • 如果intent中没有category,这个intent仍可以匹配成功

action和category匹配规则的区别

  • action要求intent中必须有一个action,且必须和intent-filter中的某个action相同
  • category要求intent中可以没有category,但是如果一旦有category,不管有几个,每个都要和intent-filter中的任何一个相同

为什么可以不用设置category

  • 因为系统在调用startActivity或startActivityForResult的时候会默认加上一个default的category
  • 为了我们的activity能够接收隐士意图,就必须在intent-filter中指定default这个category

data的匹配规则

  • 必须存在,并且完全匹配intent-filter中的某一个data
  • data的匹配和action类似,如果intent-filter中定义了data,那么intent中也要定义可匹配的data
  • data由两部分组成,mimeType和uri
  • mimeType指媒体类型
  • uri主要包含:
    • scheme:uri的模式,如果uri没有指定scheme,那么整个uri的其他参数无效,这也意味着uri也无效
    • host:主机名,同上,如果不指定host,整个uri也是无效的
    • port:端口号,仅当uri指定了scheme和host以后,port才有效
    • path/pathPattern/pathPrefix:表述路径信息
    • path:表示完整的路径信息
    • pathPattern:也表示完整的路径信息,但是它可以包含通配符星号,表示0个或多个任意字符,注意正则表达式规范
    • pathPrefix表示路径的前缀信息

data匹配的注意事项

  • mimeType是image的,如果intent-filter没有指定uri,则uri的默认值为content和file
  • intent的setData和setType会彼此清除对方的值,从源码可得知
  • 如果要为intent指定完整的data,必须要调用setDataAndType方法,传递两个参数uri和type
  • data中的scheme和uri可以分开写,这是和action的区别

其他

  • 也可以使用intent-filter打开service和broadcast
  • 但是系统对service的建议是尽量使用显示调用方式来启动服务
  • 为了避免使用隐式意图找不到activity,需要进行判断
    • 使用PackageManager中的resolveActivity方法
    • 使用Intent中的resolveActivity方法
    • 如果找不到activity就会返回null,通过判断返回值避免程序发生崩溃
  • 另外PackageManage也提供了queryIntentActivities方法,这个方法和resolveActivity方法的不同之处在于,它不是返回最佳匹配,而是返回所有成功匹配的activity信息
  • 不含default的category的activity是无法接收隐式意图的,所以在匹配的时候需要使用flag参数

重要的action和category

  • android.intent.action.MAIN
  • android.intent.category.DEFAULT
  • 这两者的共同作用是用来标明这是一个入口Activity,并且会出现在系统的应用列表中
  • 少了任何一个都没有实际意义,也无法出现在系统的应用列表,也就是两者缺一不可
  • 同样,通过PackageManager也可以获取成功匹配的service和broadcastReceiver的组件信息

05-IntentFilter的匹配规则的更多相关文章

  1. Android开发——IntentFilter的匹配规则

    1.  IntentFilter中的过滤信息 启动Activity分为显式调用和隐式调用,前者没什么好讲的,后者需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息.包括act ...

  2. 【Android - 组件】之IntentFilter的匹配规则

    我们知道,Activity的启动模式分为两种,分别是显式启动和隐式启动.显式启动需要明确的指定被启动的对象的组件信息,包括包名和类名:而隐式启动需要 Intent 能够匹配目标组件的 IntentFi ...

  3. Nginx之location 匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  4. Nginx localtion匹配规则

    mark:2016年05月25日13:20:54 (存手打,拒绝转载) 一.location分为 普通location 和 正则location 只有带有 "~" 或者" ...

  5. Intent 匹配规则

    1.在AndroidManifest.xml中可以为 每个 Activity,Service 设置多个Intent-Filter; 在系统启动和程序安装之后,android会收集AndroidMani ...

  6. Android中的Intent Filter匹配规则介绍

    本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家: ) 1. Intent简介 Intent用于在一个组件(Component,如Activity ...

  7. 前端开发掌握nginx常用功能之server&location匹配规则

    nginx主要是公司运维同学必须掌握的知识,涉及到反向代理.负载均衡等服务器配置.前端开发尤其是纯前端开发来说对nginx接触的并不多,但是在一些情况下,nginx还是需要前端自己来搞:例如我们公司的 ...

  8. 《Android开发艺术探索》读书笔记之IntentFillter的匹配规则

    使用intent启动不同组件的方法 组件类型 启动方法 Activity startActivity(Intent intent) startActivityForResult(Intent inte ...

  9. 在JaveWeb项目中配置Spring 匿名访问时,匹配规则的变相实现/*

    实现/* /** * 根据当前的URL返回该url的角色集合. * 1.如果当前的URL在匿名访问的URL集合当中时,在当前的角色中添加匿名访问的角色(SysRole.ROLE_CONFIG_ANON ...

随机推荐

  1. 死磕synchronized底层实现

    点赞再看,养成习惯,微信搜索[三太子敖丙]第一时间阅读. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. 前言 ...

  2. Redux:store

    Store是一个对象.他有如下职责: 1.存放state 2.对外提供访问state的接口: getState() 3.允许state更新:dispatch(action) 4.注册监听器: subs ...

  3. MyCat水平分库

    一.什么是水平分库 将一张表水平切分到多个库中 1.1分片原则 1.需要分片的表是少数的 2.能不切分尽量不要切分 3.日志表可以采取归档方式 4.选择合适的切分规则和分片建,确保数据分片均匀,否则依 ...

  4. iOS开发常用技能点(持续更新中。。。)

    1,以屏幕原点开始布局  (默认从导航栏原点布局) self.extendedLayoutIncludesOpaqueBars = YES;   2,向button发送点击事件 [self.playB ...

  5. 【原创】CentOS 7搭建多实例MySQL8(想要几个搞几个)

    起因 最近项目上开始重构,可能会用到主从加读写分离的情况,就想先在本地搭一个出来试试效果,结果百度一搜出来一大堆,然而自己去踩坑的没几个,绝大多数都是去抄的别人的内容,关键是实际应用中还会出错,浏览器 ...

  6. shiro的ssm集成和简单的开发尝试

    配置web.xml <!-- 配置shiro的集成开始 --> <filter> <filter-name>shiroFilter</filter-name& ...

  7. 面向对象案例 - 学生信息管理系统V1.0

    学生管理系统项目[所有知识点整合] 1. 学生管理系统项目 尝试完成以下功能 实体类: 学生类: id, 姓名,年龄,性别,成绩 需要使用数组保存学生信息 Student[] allStu 需要完成的 ...

  8. Python数据分析:pandas玩转Excel (二)

    1 对Excel文件的操作 方法一: 使用xlrd库或者xlwt库进行对excel表格的操作读与写: 方法二: pandas库同样支持excel的读写操作:且更加简便. 2 pd.read_excel ...

  9. python 验证码处理

    一. 灰度处理,就是把彩色的验证码图片转为灰色的图片. 二值化,是将图片处理为只有黑白两色的图片,利于后面的图像处理和识别 # 自适应阀值二值化 def _get_dynamic_binary_ima ...

  10. vivo产能问题

    生产手机,第一天量产1台,接下来2天(即第二.三天)每天量产2件,接下来3天(即第四.五.六天)每天量产3件 ... ... 以此类推,请编程计算出第n天总共可以量产的手机数量. public int ...