Android复习-intent-filter匹配规则

来源:互联网 发布:程序员都用什么电脑 编辑:程序博客网 时间:2024/05/29 03:05

隐式启动Activity,需要为这个Activity提供一组intent-filter进行匹配,这种隐式启动的方式往往用于启动别的App的一个Activity组件:

为一个Activity指定一组intent-filter:

        <activity android:name=".Main4Activity">            <intent-filter>                <action android:name="com.net.wrf"></action>                <category android:name="android.intent.category.DEFAULT"></category>                <category android:name="com.category.wrf"></category>                <category android:name="com.category2.wrf"></category>                <data android:scheme="file://abc" android:mimeType="image/jpeg"></data>            </intent-filter>        </activity>
一组intent-filter有三种过滤规则,action,category,data,这三种分别有不同的匹配规则。还要注意,一组intent-filter里面这三种规则都可以有多个。

action规则:区分大小写,并且必须至少有一个。也就是说在xml中必须声明一个action,而且在intent中并且setAction或者new Intent("action"),必须两个必须是完全一样。

再值得注意的就是intent只能设置一个action,多次setAction会取最后一次,而xml中可以声明多个action,所以是这样的,关于action只要能匹配上xml中的一个就行了,但是必须至少有一个。

category :我们使用intent.addCategory来为一个intent添加category,add方法意味着我们可以添加多个,这个时候它就与action有一点不一样了,它要求,你可以不add也可以add多个,但是只要你add过,xml中就必须有对应的。什么意思呢?  比如上面的指定了三种category,而我隐式启动的时候,我可以intent.addCategory("com.category.wrf"),只添加一个,而只要添加的这个在xml中有就行了,所以没必要每个都匹配上,但是如果我再加上一个addCategory("test"),则就不行了,因为xml中没有这个test这个category。 而且注意,使用startActivity或startActivityForRestul会默认为intent添加上“android.intent.category.DEFAULT”,所以我们如果想要隐式启动一个Activity就必须在xml中声明了这个category。


data : 有scheme和mimeType两个属性,它与action一样,只要有一个能匹配上就行了,但是不是必须需要有一个,也就是可以不在xml中声明,并且不需要setDataAndType,这样也能匹配上,而action是必须有的。 scheme填写的值为URI,mimeType填写的值为媒体类型,例如image/jpeg,而且设置的时候请使用setDataAndType,不可以单独使用setData或者setType,因为他们会互相清除,setData的时候会清除type,setType的时候会清除data,而且scheme也有默认值,为file或content,所以我们为了匹配上面的data,必须intent.setDataAndType(Uri.parse("file://abc"),"image/jpeg"); 第一个参数为匹配scheme设置,第二个参数为匹配mimeType设置。 有人可能会为不指定scheme呢,不指定为默认的file或者content模式,Uri.parse("file://abc")也可以匹配上,因为file匹配上了,而对于URI,没有主机名部分,abc这一部分是无效的,所以没关系,这设计到URI规则了,不记录了。

0 0