本文主要参考:任玉刚老师的《Android开发艺术探索》,特此说明。
Activity的启动分为:显式调用和隐式调用。通常情况下使用显示调用,显式调用需要明确指定启动对象的组件信息,包括包名与类名。关于隐式调用,需要Intent能够匹配目标组件中IntentFilter中所设置的过滤信息, IntentFilter中的过滤信息有action、category、data。
为了匹配、过滤列表,需要同时匹配列表中的action、category、data信息,否则匹配失败。一个列表中的action、category、data可以有多个,所有的列表中的action、category、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action类别,category类别,data类别才算完全匹配,只有完全匹配才能够成功启动目标Activity。
另外一点,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。如下所示。
<activity android:name="XxxxActivity" >
<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="application/vnd.google.panorama360+jpg" />
<data android:mimeType="image/*" />
<data android:mimeType="vidio/*" />
</intent-filter>
</activity>
********************************************************************************************
以下面的的过滤规则作为示例:
<activity
android:name="com.ryg.chapter_1.XxxxActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:launchMode="singleTask"
android:taskAffinity="com.ryg.task1">
<intent-filter>
<action android:name="com.ryg.charpter_1.c" />
<action android:name="com.ryg.charpter_1.d" />
<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>
action的匹配规则
- Intent中的action必须存在
- Intent中的action必须和过滤规则中的其中一个action相同
- action区分大小写
针对上述原则和上述过滤规则,只要我们的的Intent中的action值为“com.ryg.charpter_1.c”或“com.ryg.charpter_1.d”都能匹配成功
category的匹配规则
- Intent中的category可以没有
- 一旦存在,每个category必须和过滤规则中的任何一个category相同
Intent中的category可以没有是因为,系统在调用startActivity或startActivityForReulst的时候会默认为Intent加上”android.intent.category.DEFAULT”这个category。正好可以匹配前边过滤规则中的第三个,而intent-filter中必须制定该category。
data 的匹配规则
data稍微复杂,先了解一下它的结构。data由两部分组成:
- mimeType:媒体类型,比如image/jpeg、audio/mpeg4-generic和video/*等
- URL:由下面4部分组成
- scheme:URL的模式(如http、file、content等)
- Host:URL的主机名(如www.baidu.com)
- Port:URL中的端口号(8080)
- Path ,pathPattern ,pathPrefix:路径信息
data的过滤规则-(1)
<data android:mimeType="image/*">
指定媒体类型为所有类型图片,为了匹配该规则我们要向下面那样写:
intent.setDataAndType(Url.parse("file://abc"),"image/png")
data的过滤规则-(2)
<data android:mimeType="video/mpeg" android:scheme="http".../>
<data android:mimeType="audio/mpeg" android:scheme="http".../>
...
指定2种data规则,且每个data都指定完整属性值,既有URL又有mimeType,为了匹配该规则我们要向下面那样写:
intent.setDataAndType(Url.parse("file://abc"),"video/mpeg")
或者
intent.setDataAndType(Url.parse("file://abc"),"audio/mpeg")