美文网首页
隐式Intent和IntentFilter匹配规则

隐式Intent和IntentFilter匹配规则

作者: DrunkPian0 | 来源:发表于2017-12-01 18:10 被阅读51次
    • IntentFilter中的过滤类型有:action、category、data。 一个Activity可以有多个Filter。
    1. action的匹配规则:
      只要匹配过滤规则中的任何一个action就能匹配成功,但是必须至少有一个action能与之匹配。

    2. category的匹配规则:
      如果Intent中有category,那任何一个Category都要和IntentFilter中的Category对应。可以没有category,没有category也能配对成功。

    3. data的匹配规则:
      和action类似,如果Intent中有,就IntentFilter中必须有一个能与它匹配。
      data由两部分组成,mimeType(媒体类型)和URI。

    例子1:
    通过下面的Intent可以启动下面的IntentFilter:
    Intent:

        Intent intent = new Intent();
        intent.setAction("android:intent.yinsiyitu.action");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        //intent.setData(Uri.parse(jianren://www.ggl.com));//会清除前面所有set的type
        //intent.setType("application/person");//会清除前面所有的set的data
        //这是setData和setType两全的方法,另外如果上面的Activity定义了host,则这里一定也要指定
        intent.setDataAndType(Uri.parse("jianren://www.ggl.com"),"application/person");
        //如果上面的Activity没有定义host,则Uri.parse("jianren:");至少要写到冒号,不可以只写Uri.parse("jianren")
        startActivity(intent);
    

    IntentFilter:

         <intent-filter>
            <action android:name="android.intent.yinsiyitu.action"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/person"/>
            <data android:scheme="jianren" android:host="www.ggl.com"/>
         </intent-filter>
    

    [例子2:]
    隐式启动安装在手机中的App:

                            // 评分
                            try {
                                Uri uri = Uri.parse("market://details?id="
                                        + getActivity().getPackageName());
                                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                                startActivity(intent);
                            } catch (Exception e) {
                                JDRToast.makeText(mActivity, "没有找到应用商店").show();
                                Log.e(null, e);
                            }
    

    因为应用商店类的App会匹配market这个scheme。

    ref:
    <Android开发艺术探索Chapter1>

    相关文章

      网友评论

          本文标题:隐式Intent和IntentFilter匹配规则

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