美文网首页
IntentFilter的匹配规则

IntentFilter的匹配规则

作者: 艾特五三 | 来源:发表于2019-08-13 15:32 被阅读0次

1.启动Activity的方式

(1)启动Activity分为两种,显示调用和隐式调用。显示调用需要明确的指定被启动对象的组件信息,包括包名和类名;而隐式意图则不需要明确指定调用信息。原则上一个intent不应该即是显式又是隐式调用,如果二者共存的话以显式调用为主。
(2)隐式调用需要intent能够匹配目标组件的IntentFilter中所设置的过滤信息,一个Activity钟可以有多个intent-filter,一个intent只要能匹配一组intent-filter即可成功启动Activity,如下代码:

<activity android:name=".ShareActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
         
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>

2. action的匹配规则

(1)action是一个字符串,系统预定了一些action,同时我们也可以在应用中定义自己的action。
(2)action要求Intent中必须有一个action,且必须和过滤规则中的某一个action相同。另外,action区分大小写,大小写不同的字符串匹配也会失败。

3. category的匹配规则

(1)category是一个字符串,系统预定义了一些category,同时我们也可以在应用中定义自己的category。
(2)category要求Intent可以没有category,但是如果一旦有category,不管有几个,每个都要能和过滤规则中的任何一个category相同。

<activity
    android:name=".ThirdActivity"
    android:taskAffinity="com.seniorlibs.lifecycle.task1">
           
    <intent-filter>
        <action android:name="com.ryg.charpter_1.c" />
        <action android:name="com.ryg.charpter_1.d" />
        <action android:name="android.intent.action.VIEW" />

        <category android:name="com.ryg.category.c" />
        <category android:name="com.ryg.category.d" />
        <category android:name="android.intent.category.DEFAULT" />
        
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

为了匹配上边代码的过滤规则中的category,可出下面的

①Intent,intent.addcategory (“com.ryg.category.c”);
②或者Intent.addcategory (“com rcategory.d);
③亦或者不设category

(3)为什么不设置category也可以匹配呢?
因为在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以这个category就可以匹配前面的过滤规则中的第三个category。同时,为了我们的activity能够接收隐式调用,就必须在intent-filter中指定“android intent categor.DEFAULT”这个category,原因刚才已经说明了。

4 .data匹配规则

a. data的语法

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

data由两部分组成,mimeType和URI,前者是媒体类型,比如image/jpeg等,可以表示图片等;而URI包含的数据可就多了,下面的URI的结构:

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

(1)Scheme:URI的模式,比如http、file、content等。如果URI中没有指定的scheme,那么整个URI的其他参数无效,这也意味着URI无效。
(2)Host:URI的主机,比如"www.baidu.com"。如果host未指定,那么整个URI中的其他参数无效,这也意味着URI无效。
(3)Port:URI中的端口号,比如80,不过需要指定上面两个才有意义。
(4)Path、pathPattem和pathPrefix:这三个参数表述路径信息,其中path表示完整的路径信息;pathPattern也表示完整的路径信息,但是它里面可以包含通配符“ * ”,“ * ” 表示0个或多个任意字符,需要注意的是,由于正则表达式的规范,如果想表示真实的字符串,那么“* ” 要写成 “ *”,“ \ ”要写成“ / ”;pathPrefix表示路径的前缀信息。

b. 匹配规则

data的匹配规则和action类似,它要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data,这里的完全匹配是指过滤规则中出现的data部分也出现在了Intent中的data中。
(1)如下过滤规则

<intent-filter>
        <data android:mimeType="image/*"/>
 </intent-filter>

过滤规则没有指定URI,但是却有默认值,URI的默认值为content何file。也就是说,虽然没有指定URI,但是Intent中的URI部分的scheme必须为content或者file才能匹配,如下:

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

另外,如果要为Intent指定完整的data,必须调用setDataAndType方法,不能先调用setData再调用setType,因为这两个方法彼此会清除对方的值:

// setData会把类型设置为null,同样的,对方也是
public Intent setData(Uri data) {
        mData = data;
        mType = null;
        return this;
}

(2)如下过滤规则

<intent-filter>
    // 指出了完整的属性值,既有URI又有类型
    <data android:mimeType="video/mpeg" android:scheme="http" .../>
    <data android:mimeType="audio/mpeg" android:scheme="http" .../>
</intent-filter>
intent.setDataAndType(Uri.parse("http://abc"),"video/png");
 // 或者
intent.setDataAndType(Uri.parse("http://abc"),"audio/png"); 

c .data和action不同的地方

// 两个intent-filter作用一样
<intent-filter>
     <data android:scheme="file" android:host="www.baidu.com"/>
 </intent-filter>

 <intent-filter>
       <data android:scheme="file" />
       <data android:host="www.baidu.com"/>
 </intent-filter>
1.对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  • android.intent.action.MAIN:决定应用的入口Activity,也就是我们启动应用时首先启动显示哪一个Activity,是程序的入口。
  • android.intent.category.LAUNCHER:决定应用程序是否显示在程序列表里。表示activity应该被列入系统的启动器(launcher)(允许用户启动它)。Launcher是安卓系统中的桌面启动器,是桌面UI的统称。所谓Launcher,是指管理桌面的程序.Lanucher列表是指在桌面中显示的应用的列表.
  • 一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢?android.intent.action.MAIN决定应用程序最先启动的Activity ,是程序的入口android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里.
2.如果按照如下方式启动应用
<activity android:name=".MainActivity">
    <intent-filter>
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

应用无法运行,也无法启动


pic.png
pic.png

由于android.intent.action.MAIN决定了入口Activity,去掉它之后应用就找不到入口,不知道启动哪一个Activity。
同样只写 MAIN,没有LAUNCHER也是无法运行的

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>
pic.png
3.intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。

理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。

4.如果自己定义的某个Activity要通过隐式启动,在AndroidManifast.xm那么必须加上android.intent.category.DEFAULT,否则不起作用。除此之外,category的用途还有很多,比如做个桌面,按home键时启动自己做的应用
<activity  
    android:name=".MainActivity"  
    android:label="@string/app_name" >  
    <intent-filter>  
        <action android:name="android.intent.action.MAIN" />  
        <category android:name="android.intent.category.LAUNCHER"/>  
        <category android:name="android.intent.category.HOME" />  
    </intent-filter>  
</activity>  
5.为什么加入android.intent.category.DEFAULT?

一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category,即android.intent.category.DEFAULT,只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。

多多指教哈

image.png

相关文章

  • 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/wdzvjctx.html