Activity的启动方式有显式和隐式。显式需要指定被启动对象的组件信息,比如类名。隐式不需要指定组件信息,但需要Intent能够匹配目标Activity的intent-filter中所设置的过滤信息,如果匹配成功了才能启动目标Activity。
1.那么怎样才是匹配intent-filter成功了呢?
总的来说只要满足以下3点就是匹配intent-filter成功了:
一个Activity中可以有多组intent-filter,一个Intent只要匹配任何一组intent-filter就算匹配成功。
一个intent-filter中可以有多个action,category,data并各自构成不同类别。
一个Intent必须同时匹配action类别,category类别和data类别才算完全匹配。
2.那么如何来匹配action,category,data呢?
(1)action
- 系统默认定义了一些action。
如:<action android:name="android.intent.action.MAIN"/> - 可以自定义action。
- action是一个字符串。
- Intent必须存在action,且只有一个action。
- Intent只能设置一个action,后面设置的action会覆盖之前设置的action。
- intent-filter中可以同时有多个action,Intent只需要匹配intent-filter中的一个action即可。
(2)category
- 系统默认定义了一些category。
<category android:name="android.intent.category.LAUNCHER"/> - 可以自定义category。
- category是一个字符串。
- Intent中可以不设置category,这个时候在使用startActivity或者startActivityForResult的时候,系统自动会为你添加默认category(android.intent.category.DEFAULT)。
- intent-filter中必须添加“android.intent.category.DEFAULT”这个过滤条件。(切记)
- Intent中可以同时设置多个category,一旦设置多个catrgory,那么每个category都必须能够和intent-filter中的某个category匹配成功。
- 只通过category匹配是无法匹配到Activity的。因为category属性是一个执行Action的附加信息。
(3)data
- data由两部分组成mineType和URI。
- mineType: 指媒体类型 例如: image/jpeg
- URl 可配置更多信息,类似于url。
我们可以看下URI的结构<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
如:content://com.axe.mg:100/fold/subfolder/etc或http://www.axe.com:500/profile/info
总结: