android中intent的使用

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组件。有多个会要用户进行选择。
            <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组件。有多个会要用户进行选择。

猜你喜欢

转载自lwx522.iteye.com/blog/2030192