美文网首页
IntentFilter的匹配规则

IntentFilter的匹配规则

作者: Tom_Ji | 来源:发表于2018-11-01 10:50 被阅读2次

IntentFilter的匹配规则

IntentFilter中的过滤信息有action,category,data。只有同时匹配过滤表中的action、category、data信息,才算匹配成功。

一个过滤列表中的action、category和data可以有多个,所有的action、category、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action、category、data才算完全匹配,只有完全匹配才能成功启动目标
Activity。一个Activity可以有多个intent-filter,一个Intent只需要匹配其中一组intent-filter就可以成功启动对应的Activity。
Android 原生设置(Settings)的AndroidManifest.xml文件中有如下代码:

<activity android:name="Settings$ApnEditorActivity"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:label="@string/app_name">
      <intent-filter>
          <action android:name="android.intent.action.VIEW"/>
          <action android:name="android.intent.action.EDIT"/>
          <category android:name="android.intent.category.DEFAULT"/>
          <data android:mimeType="vnd.android.cursor.item/telephony-carrier"/>
      </intent-filter>
            
      <intent-filter>
          <action android:name="android.intent.action.INSERT"/>
          <category android:name="android.intent.category.DEFAULT"/>
          <data android:mimeType="vnd.android.cursor.dir/telephony-carrier"/>
      </intent-filter>

      <meta-data
          android:name="con.android.settings.FRAGMENT_CLASS"
          android:value="com.android.settings.ApnEditor"/>
</activity>

启动此Apn编辑界面,需要匹配其中任意一组intent-filter即可。

1.action的匹配规则
action是一个字符串,它的匹配规则是Intent中的action必须能够和过滤规则中的action匹配(字符串值完全相同)。一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
2.category的匹配规则
category是一个字符串,它的匹配规则是Intent中如果包含category,那么所有的category都必须和过滤规则中的其中一个category相同,即Intent中包含的category(可以为空,不包含category)是过滤规则category的子集。系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,同时,为了Activity能够接收隐式调用,就必须在intent-filter中指定“android.intent.category.DEFAULT”这个category。
3.data的匹配规则
data的匹配规则和action类似,要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。这里的完全匹配是指过滤规则中出现的data部分,也出现在了Intent中的data中。
data的语法如下:

<data  android:scheme="string"
       android:host="string"
       android:port="string"
       android:path="string"
       android:pathPattern="string"
       android:athPrefix="string"
       android:mimeType="string" />

data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg、video/*等。URI包含的数据比较多,URI的结构如下:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
例如:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info

其中,各部分的参数含义如下:
scheme URI的模式,例如http、file、content等。
host URI的主机名,例如www.google.com等。
port URI的端口号,例如80,只有当URI中指定了scheme和host参数的时候,port参数才有意义等。
path、pathPattern和pathPrefix 这三个参数表示路径信息,path表示完整的路径信息;pathPattern也表示完整的路径信息,但是可以包含通配符“*”,由于正则表达式的规范,如果想表示真是的字符串,需要将“*”写成“\\*”,"\",要写成“\\\\”,pathPrefix表示路径的前缀信息。

如果要为Intent指定完整的data,必须要调用setDataAndType方法。

有一类action和category比较重要,这两个共同作用来表示这是一个入口Activity,并且会出现在系统的应用列表中。

    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"

在通过隐式方法启动一个Activity的时候,需要增加判断,可以使用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果找不到对应的Activity就会返回null,避免启动的Activity不存在引起程序崩溃。

相关文章

  • IntentFilter的匹配规则

    允许转载请注明出处。 IntentFilter的匹配规则 对于初学者来说,学习IntentFilter的匹配规则还...

  • IntentFilter的匹配规则

    IntentFilter的匹配规则 IntentFilter中的过滤信息有action,category,data...

  • IntentFilter匹配规则

  • IntentFilter匹配规则

    首先废话一下,如果要写东西,csdn和简书还是老老实实选简书。不管什么,就冲csdn不会自动保存,简书会自动保存就...

  • IntentFilter匹配规则

    IntentFilter直译过来就是意图过滤器,我们可以通过它的匹配规则去打开我们想要打开的一类Activity,...

  • IntentFilter的匹配规则

    前言 我们知道,启动Activity分为两种,显示调用和隐式调用。这里主要介绍隐式调用的IntentFilter匹...

  • IntentFilter的匹配规则

    启动Activity分为两种,显示调用和隐式调用。显式调用需要明确的指定被启动对象的组件信息,包括包名和类名...

  • IntentFilter的匹配规则

    我们知道,Activity的启动模式分为两种,分别是显式启动和隐式启动。显式启动需要明确的指定被启动的对象的组件信...

  • IntentFilter 的匹配规则

    1. 显示调用与隐式调用   显示调用需要明确指定被启动对象的组件信息,包括类名与包名,隐式调用不需要明确指定组件...

  • IntentFilter的匹配规则

    Activity的隐式调用需要明确指定组件信息。原则一个Intent不应该既是显式又是隐式调用,如果两者共存的话以...

网友评论

      本文标题:IntentFilter的匹配规则

      本文链接:https://www.haomeiwen.com/subject/crbtxqtx.html