IntentFilter 匹配的一些事

启动Activity的两种方式

  • 显示调用

    就像我们平时用的最多的
    startActivity(new Intent(this,XXXActivity.class);

  • 隐示调用

    就是通过匹配IntentFilter中设置的过滤信息进行调用。下面主要是匹配的方式和规则

IntentFilter 的过滤信息

  • action

    一个字符串,可以自定义,一般会结合包名。

  • category

    一个字符串,可以自定义,一般会结合包名。

  • data

    两部分组成,mimeType和URI。mimyType指的是媒体类型,比如image/jpeg,audio/mpeg4-generic和video/*等,表示图片文本视频等不同格式,而URI有特定结构:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

scheme:URI的模式,比如http,ftp,file,必须指定
host:URI的主机名,比如www.baidu.com,必须指定
port:URI的端口号,比如80,当前两者均指定时才有效
path等:表示路径信息

例子:http://www.baidu.com:80/search/info

IntentFilter 的过滤规则

  • action

    Intent中的action必须能够和filter中的字符串值完全一样,并且只需要匹配其中一个。ps 如果在intent中没有指定action则匹配失败。

  • category

    Intent中的所有category必须在filter中已经存在。ps 不设置category也可以匹配成功,因为系统在调用startActivity或startActivityForResult的时候会默认在intent加上“android.intent.category.DEFAULT”,当然前提是想要隐式调用必须在filter规则上加上DEFAULT这个category。

  • data

    data的匹配规则和action类似,它也要求intent中必须含有data数据,并且能完全匹配filter中的某一个data.

如下filter规则

<intent-filter>
    <data android:mimeType="image/*"/>
    ...
</intent-filter>

这种规则虽然没有指定URI ,却有默认值,URI的默认值为content和file,也就是说,scheme部分必须为content和file才能匹配!为此可以写出如下示例

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

完整的匹配例子

filter规则:

<activity
    android:name="com.example.FirstActivity:
    android:launchMode="singleTask"
    <intent-filter>
        <action android:name="com.example.action.a"/>
        <action android:name="com.example.action.b"/>
        <category android:name="com.example.category.a"/>
        <category android:name="com.example.category.b"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

匹配:

Intent intent = new Intent("com.example.action.a");
intent.addCategory("com.example.category.a");
intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
startActivity(intent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值