Android笔记三:IntentFilter

IntentFilter

启动activity方式有两种:1.显示启动;2.隐式启动。显示启动要明确的指定启动对象的组件信息,包括包名和类名,而隐式启动则不需要指定组件信息。原则上Intent不应该是显示调用又是隐式调用,如果二者共存的话,以显式为主。隐士启动需要匹配目标组件的IntentFilter中所设置的过滤信息。Intent过滤信息有:action、category、data。

<activity android:name=".SecondActivity">
        <intent-filter>
                <action android:name="com.lynnlee.action1"/>
                <category android:name="com.lynnlee.category1"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http" android:host="www.baidu.com"        
                      android:mimeType="video/mpeg"/>
        intent-filter>
activity>

为了匹配过滤列表,需要同时匹配IntentFilter中的action、category、data。一个IntentFilter可以有多个action、data、category,一个Activity中可以有多个IntentFilter。只需要满足一个IntentFilter中任意一组action、category、data或者满足任意一个IntentFilter即可。

1.action匹配规则

action可以自定义,IntentFilter至少有一个action,只要能匹配其中一个action即可。

2.category匹配规则

category可以自定义,IntentFilter可以没有、一个或者多个category,没有的情况下会默认有一个category(”android:intent.category.DEFAULT”),但是一旦有category,就必须匹配至少其中一个。注意一点,如果自定义category就必须加上android:intent.category.DEFAULT,因为Android规定intent-filter节点下有android:intent.category.DEFAULT才可以接受隐式启动。

3.data匹配规则

如果intent-filter中定义了data,就必须匹配。data由两部分组成:mimeType和URI。mimeType指定媒体类型,比如image/jpeg\audio/mpeg4-generic、text/plain和video/*等,而URI包含数据较多。

  • 1.Scheme:URI的模式,比如http、file、content等,如果没有指定sheme,那么整个URI无效;
  • 2.Host:URI的主机,比如www.baidu.com,如果没有指定Host,那么整个URI无效;
  • 3.Port:端口号,仅当URI有scheme和host时port才有效;
  • 4.Path、pathPattern、pathPrefix三个参数描述路径信息,其中path表示完整路径信息,pathPattern可表示完整路径,但是里面可以包含通配符“*”,需要注意的是正则表达式的规范,如果需要表达真是的字符串,那么“*”需要写成“\\*”,”\”写成“\\\\”,pathPrefix表示路径前缀信息。

    "image/*"/>
    ...

如果没有写URI,但有默认值,URI默认值content和file。也就是说这种情况下Intent中的URI部分的scheme必须为content或者file才可匹配,这点尤其重要。为匹配上规则

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

Intent指定完整的data,需要调用setDataAndType方法,不能调用setData和setType,因为这两个方法会回想清除对方值。

当我们用隐士开启activity时有可能报错,所以最好做判断:

  • 1.Intent的resolveActivity
  • 2.PackageManager的querIntentActivites和resolveActivity,第二个参数MATCH_DEFAULT_ONLY含义:至匹配在Intent-filter中声明了category android:name=”android.intent.category.DEFAULT”的activity

  • 方法 1

ComponentName componentName = intent.resolveActivity(getPackageManager());
if (null == componentName){
   Log.i("lynnlee","null");
   return;
}
  • 方法 2
List resolveInfos = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfos.size()<=0){
    Log.i("lynnlee","null");
    return;
}
  • 方法 3
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (null == resolveInfo){
     Log.i("lynnlee","null");
     return;
 }

你可能感兴趣的:(android基础,android)