美文网首页
IntentFilter 的匹配规则与例子

IntentFilter 的匹配规则与例子

作者: zhaoyubetter | 来源:发表于2017-02-16 14:34 被阅读85次

    参考##

    1.《Android开发艺术探索》

    主要针对隐式调用,隐士调用需要intent能够匹配目标组件的IntentFilter所设置的信息,如:启动服务、广播、Activity等;
    IntentFilter的过滤信息有action、category、data,
    如下:

    <!-- 对外处理推送,web打开app的中转Activity -->
            <activity
                android:name=".open.TransferActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" >
                <intent-filter android:priority="0x7FFFFFFF" >
                    <action android:name="android.intent.action.VIEW" />
                    <!-- 显示数据 -->
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <!-- 定义成浏览器类型,有URL需要处理时会过滤 -->
                    <data
                        android:host="better.com"
                        android:scheme="open.better" />
                </intent-filter>
            </activity>
    

    为匹配规则列表,需要同时匹配过滤列表中 action、category、data信息;

    action的匹配规则###

    action是一个字符串,系统也预定义了一些,我们也可以自定义,如要匹配,必须和intent中的action的完全一致,并区分大小写;
    只要intent中的action能够和过滤规则中的任何一个action相同,即匹配成功;

    常用的系统的自带的action:

    1. Intent.ACTION_MAIN( android.intent.action.MAIN ): 应用入口;
    2. Intent.ACTION_VIEW(android.intent.action.VIEW): 用于显示用户的数据,比较通用,会根据用户的数据类型打开相应的Activity;

    category的匹配规则###

    与action类型,系统也预定义了一些; 如果intent中含有category,如果目标组件中,含有此category,则表示匹配成功;另外系统会默认在intent添加 android.intent.category.DEFAULT,这个category,为了 activity能接收到隐式调用,需要在intent-filter中指定 DEFAULT这个category,如上图;

    data的匹配规则###

    data的匹配规则和action类似,如果过滤规则中,定义了data,那么intent中,也要定义可匹配的data;
    data的语法结构

    <data android:scheme="string"
         android:host=""
         android:port="" 
         android:path=""
         android:pathPattern=""
         android:pathPrefix=""
         android:mimeType=""
    />
    

    她其实就是由2部分组成:mimeType 和 URI,mimeType指定媒体类型,如:image/jpeg,
    uri为:

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

    path表示完整的路径信息;
    pathPattern亦可表示路径,但可包含通配符(),如:"\", 表示匹配任何字符;
    pathPrefix表示路径前缀;

    data匹配规则
    data要求intent中必须含有data数据,并且data数据能够完成匹配过滤规则中的某一个data。这里完全匹配指定的是过滤规则中的data部分也出现在了intent中的data中;

    1. 如下规则:
    <!-- --> 
    <intent-filter>
        <data android:mimeType="image/*"/>
        ....
    </intent-filter>
    

    指定媒体类型为所有图片,如:intent为 intent.setDataAndType(Uri.parse("file://abc"), "image/png") ;这种intentFilter虽然没有指定URI,系统会有默认值设定,默认值为content和file;即:URI的schema是有默认值的;
    如要为intent指定完整的data,必须要调用 setDataAndType方法;


    避免异常###

    如果通过intent隐式意图来启动activity,如果没有任何匹配,App会crash,为避免此情况发生,
    可以先判断一下,采用PackageManger的resolveActivity或 Intent的resolveActivity方法;


    具体的例子###

    回到,文章开头的示例配置,我们配置了,可以通过浏览器(category:android.intent.category.BROWSABLE),startActivity(android.intent.category.DEFAULT) 2种外部启动方式,来启动该Activity;

    // 通过intent来启动,比如:其他app,打开本app,需要传递特定参数时
    Intent intent = new Intent();
    intent.setAction("android.intent.action.VIEW");
    Uri uri = Uri.parse("open.better://better.com?type=otherInfo");  // type为传递的参数;
    intent.setData(uri);
    startActivity(intent);
    
    // 通过http:// 链接形式启动
    <a href="open.better://better.com?type=type01">打开Better</a>
    
    // 具体解析:
    Uri data = getIntent().getData();       // 来自外部链接
    // 处理intent
     Intent bizIntent = null;
     // 来自 外部启动
    if (data != null) {
                String scheme = data.getScheme();       // scheme
                  // 如果来着 web 启动
                    if (“open.better”.equals(scheme)) {
                        String host = data.getHost();                        // host
                        String type = StringUtils.convertToSafeString(data.getQueryParameter("type"));
       // 其他操作
    

    相关文章

      网友评论

          本文标题:IntentFilter 的匹配规则与例子

          本文链接:https://www.haomeiwen.com/subject/kpbqwttx.html