intent-filter 的匹配规则

只写Action 不行,

<activity android:name=".a.BActivity">
    <intent-filter>
        <action android:name="intent.action.test.bbb" />
    </intent-filter>
</activity>


// 这样只写Action 发生了崩溃
public void onClick(View v) {
    Intent intent = new Intent();
    intent.setAction("intent.action.test.bbb");
    startActivity(intent);
}


android.content.ActivityNotFoundException: No Activity found to handle Intent { act=intent.action.test.bbb }

加上Category 就行了。例如这样

<activity android:name=".a.BActivity">
    <intent-filter>
        <action android:name="intent.action.test.bbb" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>


// 这样就跳转成功了
public void onClick(View v) {
    Intent intent = new Intent();
    intent.setAction("intent.action.test.bbb");
    intent.addCategory("android.intent.category.DEFAULT");
    startActivity(intent);
}

只要Intent 的action 能够与过滤规则的任何一个action 相同即可匹配成功。(action 区分大小写)

为什么不写category 也能匹配成功呢?因为系统在调用startActivity() 或startActivityForResult() 的时候会默认为Intent 加上"android.intent.category.DEFAULT"  这个category 。比如这样写。

<activity android:name=".a.BActivity">
    <intent-filter>
        <action android:name="intent.action.test.bbb" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>


// 没写category 也能跳转成功
public void onClick(View v) {
    Intent intent = new Intent();
    intent.setAction("intent.action.test.bbb");
    startActivity(intent);
}

如果写了category ,不管写几个,对于每个category 来说,它必须是过滤规则已经出现的。

<activity android:name=".a.BActivity">
     <intent-filter>
        <action android:name="intent.action.test.bbb" />
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.123987"/>
        <data android:mimeType="text/plain"/>
     </intent-filter>
</activity>


// 这样可以跳转
public void onClick(View v) {
    Intent intent = new Intent();
    intent.setAction("intent.action.test.bbb");
    intent.addCategory("android.intent.category.123987");
    intent.setDataAndType(Uri.parse("file://abc123987"),"text/plain");
    startActivity(intent);
}

只写 intent.setDataAndType(Uri.parse("file://abc123987"),"text/plain"); 会这样

应该是匹配了"text/plain" 这个,然而有好多这个类型,所以让你选。

只要加了action 就要在注册时加<category android:name="android.intent.category.DEFAULT"/>

 

如果过滤规则定义了data ,那么Intent 必须也要定义可匹配的data 。

如果注册时加了<data android:mimeType="text/plain"/> ,那么在跳转时要加上data ,例如intent.setDataAndType(Uri.parse("file://abc123987"),"text/plain");

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值