Intent的用法(4):Action、Category、Data以及匹配规则

Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作“,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合使用。

Action要完成的只是一个抽象的动作,这个动作具体由哪个组件(或许是Activity,或者是BroadcastReceiver)来完成,Action这个字符串本身并不管。比如Android提供的标准Action:Intent.ACTION _VIEW,它只表示一个抽象的查看操作,但具体查看什么、启动哪个Activity来查看,Intent. ACTION _VIEW并不知道。这取决于Activity的< intent-filter>配置,只要某个Activity的< intent-filter>配置中包含了该ACTION _VIEW,该Activity就有可能被启动。

要注意的是:

  • 一个Intent对象最多只能包含一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值
  • 一个Intent对象可以包含多个Category属性,程序可调用Intent的addCategory(String str)方法来为Category属性
  • 当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件

匹配规则

Android 中隐式启动组件的匹配规则主要是根据 Action、Category、Data来匹配。

Action:定义匹配动作,属性值为一个字符串
Category:属性用于指定当前动作(Action)被执行的环境。
Data:用于指定数据,通常是URI格式

1. 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


2. 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” />


3. Data匹配与Action相同

只要包含所需要的data即可
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>

<action android:name=“android.intent.action.VIEW” /> 系统根据不同的Data类型,通过筛选出已注册的Application来显示数据

<category android:name=“android.intent.category.DEFAULT” />默认的Category ,隐式启动的组件必须包含

<category android:name=“android.intent.category.BROWSABLE” />设置该组件可以使用浏览器启动

Data响应协议为myScheme域名为myHost.app,即“myScheme://myHost.app”,还可以设置port、path等信息,更精确的过滤

这样既可通过点击超链接打开组件,注意微信等一些其他app对浏览器做了修改,会屏蔽这些事件

 <activity
            android:name=“XXXActivity”
            android:screenOrientation=“portrait”
            android:theme="@style/myTheme"
            android:windowSoftInputMode=“adjustResize|stateHidden”>
            <intent-filter>
                <action android:name=“android.intent.action.VIEW” />
                <action android:name=“android.intent.action.SEND” />
                <category android:name=“android.intent.category.DEFAULT” />
                <data android:mimeType=“application/pdf” />
                <data android:mimeType=“application/msword” />
                <data android:mimeType=“text/html” />
                <data android:mimeType=“application/vnd.openxmlformats-officedocument.wordprocessingml.document” />
            </intent-filter>

 </activity>

 当前注册的Activity组件就是一个可以打开html、pdf、doc、docx文件的组件

 <action android:name=“android.intent.action.VIEW” />
 <action android:name=“android.intent.action.SEND” />

 就是我们通常在微信或者QQ中遇到的使用第三方应用打开或者本地文件选择“发送”选项的场景,这里的data过滤使用了mimeType,当然也可以同时使用mimeType和URI

<intent-filter>
        <action android:name=“android.intent.action.VIEW” />
        <action android:name=“android.intent.action.SEND” />
        <category android:name=“android.intent.category.DEFAULT” />
        <data android:mimeType=“text/html”
                android:host=“myHost.app”
                android:scheme=“myScheme”
                android:port=8888
                android:path=“xxxxx”/>
</intent-filter>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值