隐式Intent和IntentFilter匹配规则

2017-12-01  本文已影响51人  DrunkPian0
  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>

上一篇下一篇

猜你喜欢

热点阅读