当前位置: 代码迷 >> 综合 >> Android中Action、Category、Data匹配规则
  详细解决方案

Android中Action、Category、Data匹配规则

热度:29   发布时间:2023-11-20 10:36:19.0

Android 中隐式启动组件的匹配规则主要是根据 Action、Category、Data来匹配。
Action:定义匹配动作,属性值为一个字符串
Category:属性用于指定当前动作(Action)被执行的环境。
Data:用于指定数据,通常是URI格式


Action匹配只要有一个与Intent中携带Action相同即可:
<activity android:name=".androidImplicitFilter.ActionActivity">
            <intent-filter>
                <action android:name="com.action.a" />
                <action android:name="com.action.b" />
                <action android:name="com.action.c" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
</activity>

Intent中只要携带"com.action.a"、"com.action.b"、"com.action.c"中的一个就可以启动ActionActivity


Category匹配要包含全部Intent中携带Category
Category是一个字符串,系统中预定义了一些Category,也可以自定义Category
Intent intent = new Intent("com.action.a");
        intent.addCategory("com.category.a");
        intent.addCategory("com.category.b");
        startActivity(intent);
intent包含2个Category ,"com.category.a"、"com.category.b"。要启动的组件必须包含这两个Category
<activity android:name=".androidImplicitFilter.ActionActivity">
            <intent-filter>
                <action android:name="com.action.a" />
                <action android:name="com.action.b" />
                <action android:name="com.action.c" />


                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.category.a" />
                <category android:name="com.category.b" />
                <category android:name="com.category.c" />
            </intent-filter>
        </activity>

Intent默认会携带"android.intent.category.DEFAULT",所以隐式启动的组件必须包含 <category android:name="android.intent.category.DEFAULT" />


Data匹配与Action相同
Data匹配规则与Action类似,Data一般由两部分组成mimeType和URI,mineType指资源类型包括文本、图片、音视频等等
URI结构如下:scheme://host:port/(path|pathPrefix|pathPatten)
例如 http://www.myHost:8080/user/index.html
    content://com.download/file/10089
scheme:URI的协议例如http、file、content,如果URI没有指定scheme,那么这个URI即使有其他部分也是无效的
host:域名,如果未指定那么也没效果,URI也就无效
port:端口号,scheme和host指定时才有效
path|pathPrefix|pathPatten:包含路径信息


假如我们要通过响应一个超连接打开相应的组件,我们可以这样实现:
 <intent-filter>
                <action android:name="android.intent.action.VIEW" />


                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="myHost.app"
                    android:scheme="myScheme" />
</intent-filter>


详细请看:Android中Action、Category、Data匹配规则

  相关解决方案