隐式Intent和IntentFilter匹配规则

  • 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:

     
        
        
        
        
     

[例子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:

你可能感兴趣的:(隐式Intent和IntentFilter匹配规则)