启动Activity的方式分为两种,显示和隐式调用。显示调用很简单,直接指明要启动的Activity就可以了,这里主要介绍一下隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。只有一个Intent同时匹配action,category和data才算匹配成功。
示例
|
|
action匹配规则
action是一个字符串,系统预定义了一些action,我们也可以自己定义action。
添加方法
|
|
注:
- 一个intent-filter中可以有多个action
- intent中的action与intent-filter中有一个相同即可
- action区分大小写;
category匹配规则
添加方法
|
|
注:
- intent中可以不存在category,但如果存在就必须匹配intent-filter其中一个
- 系统在startActivity或者startActivityForResult的时候默认为Intent加上一个android.intent.category.DEAFAULT,所以必须在intent-filter中加上android.intent.category.DEFAULT这个category
data匹配规则
data语法
|
|
组成
data由两部分组成,mimeType和URI。
URI格式如下:
##匹配规则
匹配规则与action类似,只要有一个data匹配就可以。
注:
虽然没有指定URI,但是URI有默认值,默认值为content和file,所以intent的URI部分必须为content或者file才可以。
下面的方法可以匹配他
最后
intent-filter的规则对于Service和BroadcastReceiver是一样的,但是对于Service建议尽量使用显示方法来启动。
在使用隐式Intent时可以先对是否有相应的Activity做出判断,以防出错。采用PackageManager的resolveActivity方法或者Intent的resolveActivity,如果匹配不到就返回null。
|
|
MATCH_DEFAULT_ONLY的目的是去除那些category中不含DEFAULT的Activity。