android中在进行界面跳转时需要用到Intent,而Intent又分为显示Intent和隐式Intent。
显示Intent:通常给Intent指定了具体的组件的称为显示Intent,这种只会跳转到唯一一个界面。
Intent intent = new Intent();
//"com.lwx.myapp"为比如应用包名, "com.lwx.TestActivty1"为activity的className
intent.setComponent(new ComponentName("com.lwx.myapp", "com.lwx.TestActivty1"));
//跳转到TestActivty1
startActivity(intent);
实际使用中我们一般写成下面这种形式
Intent intent = new Intent(this, TestActivty1.class);
//跳转到TestActivty1
startActivity(intent);
隐式的Intent:这个一般是在AndroidManifest.xml文件中定义Activity时用到,<intent-filter>过滤器形式存在。
intent-filter有三个子元素,action、category、data,这个过滤有点类似struts中action映射,但是又有很大的区别,struts中的action是唯一的,而intent-filter中的action是可以存在多个,intent中设置一个action是可以对应多个Activity的。category是分类,我的理解是增加匹配的精确度,intent-filter中一般都必须包含
<category android:name="android.intent.category.DEFAULT" />,data占时没用到就没研究,在代码中隐式的跳转界面时如下:
Intent intent = new Intent();
intent.setAction("testAction");
intent.addCategory("testCategory");
//匹配<action android:name="testAction" />
//<category android:name="testCategory" />
//<category android:name="android.intent.category.DEFAULT" />
startActivity(intent);
通过上面的方式,页面可以跳转到按以下方式定义Activity中
<activity
android:name="com.example.androidbase.Activity1"
android:label="Activity1" >
<intent-filter>
<action android:name="testAction" />
<category android:name="testCategory" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
如果有多个Activity的匹配到,会弹出一个界面让用户选择跳转到那个界面
像这个方式我们其实也经常遇到,比如你在看短信时,短信中有一个链接,如果你手机中安装了多个浏览器,此时会要你选择使用那个浏览器。
intent-filter匹配规则
匹配规则为,首先匹配action,action中如果没有符合的就代表没有匹配到,匹配到action之后才考虑category。
action匹配规则是只要匹配到一个就可以了,比如有<action android:name="testAction" />和<action android:name="testAction2" />,intent.setAction("testAction");是可以匹配到的
category匹配规则为包含关系,就是代码中intent.addCategory("");增加的category(可以有add多个)在配置文件中intent-filter中必须要包含。比如
intent.setAction("testAction");
intent.addCategory("testCategory1");
可以匹配
<intent-filter>
<action android:name="testAction" />
<category android:name="testCategory1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
也可以匹配
<intent-filter>
<action android:name="testAction" />
<category android:name="testCategory2" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
总之:
1、在代码中显示的发起intent调用时,由于已经明确的知道要start的组件,<intent-filter>中的配置对它是不起作用
2、在代码中隐式的发起intent调用时,是会到AndroidManifest.xml定义的组件中的<intent-filter>
逐个去匹配的,如果匹配到仅只一个就会start组件。有多个会要用户进行选择。