1.启动Activity的方式
(1)启动Activity分为两种,显示调用和隐式调用。显示调用需要明确的指定被启动对象的组件信息,包括包名和类名;而隐式意图则不需要明确指定调用信息。原则上一个intent不应该即是显式又是隐式调用,如果二者共存的话以显式调用为主。
(2)隐式调用需要intent能够匹配目标组件的IntentFilter中所设置的过滤信息,一个Activity钟可以有多个intent-filter,一个intent只要能匹配一组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相同。
为了匹配上边代码的过滤规则中的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由两部分组成,mimeType和URI,前者是媒体类型,比如image/jpeg等,可以表示图片等;而URI包含的数据可就多了,下面的URI的结构:
://:/[||]
// 例子
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)如下过滤规则
过滤规则没有指定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)如下过滤规则
// 指出了完整的属性值,既有URI又有类型
intent.setDataAndType(Uri.parse("http://abc"),"video/png");
// 或者
intent.setDataAndType(Uri.parse("http://abc"),"audio/png");
c .data和action不同的地方
// 两个intent-filter作用一样
1.对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解
- 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.如果按照如下方式启动应用
应用无法运行,也无法启动
由于android.intent.action.MAIN决定了入口Activity,去掉它之后应用就找不到入口,不知道启动哪一个Activity。
同样只写 MAIN,没有LAUNCHER也是无法运行的
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键时启动自己做的应用
5.为什么加入android.intent.category.DEFAULT?
一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category,即android.intent.category.DEFAULT,只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。
多多指教哈