• 05-IntentFilter的匹配规则


    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的组件信息
  • 相关阅读:
    【转】 web前端基础知识-(五)jQuery
    【转】 web前端基础知识-(四)DOM
    【转】 web前端基础知识-(三)JavaScript基本操作
    【转】 web前端基础知识-(二)CSS基本操作
    【转】 web前端基础知识-(一)html基本操作
    Vue的dom更新机制 & Vue的nextTick
    VUE项目中实现PDF预览
    WebView
    Nginx服务器
    前端存储 --- cookie & localStorage & sessionStorage & Web SQL & IndexDB & Cache Storage
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6855663.html
Copyright © 2020-2023  润新知