intent-filter匹配与scheme跳转协议


用Intent进行活动及其他组件的启动有显式启动和隐式启动两种方式,显式不必多说,隐式就是在Intent里配置一些参数,然后去和整个系统中注册的组件(一般是activity)进行匹配,启动匹配成功的组件(匹配成功不止一个时全部显示让用户进行选择)。


隐式启动可以方便的跨应用启动活动,在网页中启动等,用到的地方还是很多。


匹配的依据是主配置文件中组件的<intent-filter>子标签,可以不止一组,只要匹配成功其中一组即视为匹配成功。

intent-filter又有action,catagory,data子标签,每个出现次数都是大于等于一,可以认为是三个需要匹配的方面,每一个方面只需匹配其中一个即视为匹配成功。

action和catagory都比较简单,只是一个字符串。data比较复杂,他可以认为分成mimetype和uri两部分,mimetype是媒体类型,有image/jpeg等,这里不做深入探究。uri则对应着data的scheme,host,port等标签。Uri的结构类似于Url,scheme是协议(http),host是域名(www.baidu.com),port就是端口号了。

data匹配成功的条件是,data中出现的所有属性Intent都匹配。

举个例子:

		Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse("test://app"));
                startActivity(intent);
主配置文件中有这么两个活动:

<activity android:name=".CActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="test" />
            </intent-filter>
        </activity>
        <activity android:name=".DActivity">
            <intent-filter>
                <category android:name="android.intent.category.BROWSABLE"></category>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="test"
                    android:host="app"/>
            </intent-filter>
        </activity>

感觉上应该匹配第二个,因为第一个只有scheme没有host,第二个更具体。实际上两个都是匹配的,第一个中给出了scheme,Intent匹配这个scheme,也就是匹配了data中全部属性,所以匹配成功。


其他注意事项:

1.Intent默认带一个DEFAULT的catagory

2.没有DEFAULT的catagory的活动不接受隐式启动

3.检测Intent匹配结果是否为空:

看PackageManager的resolveActivity和quertIntentAtys,Intent的resolveActivity返回值是否为空。这些方法第二个参数设为MATCH_DEFAULT_ONLY,意为只匹配含有DEFAULT的catagory的活动,原因见2.

4.网页中使用隐式启动只需要<a href='uri'/>,默认使用Intent的action是View(也就是说目标aty中要有这个action)。

而且目标aty中必须有BROWSABLE的catagory,否则点击超链接后无法成功跳转(亲测)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值