android之鲜为人知的Intent功能

来源:互联网 发布:windows资源监视器 编辑:程序博客网 时间:2024/05/16 22:27

说起来Intent,大家肯定会说,谁不会啊?大家都用过,跳转activity,数据传递等。没错,确实这些大家都用过,因为这是最常见的的功能了,但是干过几年开发的都不一定知道Intent的其他功能和使用,毕竟不常见,虽然都是些基础的东西,但是不一定知道,所以了解下还是没坏处的。

Intent有4个重要的属性,大家最常见的就是Data,Action,Extra,还有少见的Category。

Intent分为显式和隐式,相信大家都知道。显示大家经常用于Activity的跳转,直接指定想要跳转的目标Acitivty,例如:

Intent intentTo = new Intent(XActivity.this, YActivity.class);startActivity(intentTo);

Intent的意图非常明显,跳到YAcitivty,所以称为显式Intent。
那么什么是隐式Intent呢?隐式Intent就是意图不明显,需要系统去分析看哪个是合适的Activity去启动。
隐式启动Activity,必须同时匹配action和category,这两个都需要再manifest中的activity下进行设置,然后在跳转的时候进行匹配,看是否有activity的action和category是否合适,是就进行跳转。
先来看看,我们每次启动app,都会有一个界面是程序的入口,第一个默认启动的界面,还记得manifest中怎么写的嘛:

<activity android:name=".activity.MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>        </activity>

这里就体现出了action和category的作用了,acion.MAIN表示程序的入口,category.LAUNCHER表示当前应用程序优先级最高的Activity,两者一起使用,就像前面说的,隐式intent会同时匹配action和category,所以这两个如果缺一个都无法启动程序,这就是为什么每次第一个activity会有上述两个属性。再看下面例子:

<activity android:name=".activity.FirstActivity" >            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>            </intent-filter>        </activity>Intent intent = new Intent("com.xjj.test.FIRSTACTION");        startActivity(intent);

此时进行跳转发现程序崩溃,相信大家知道为啥了,因为必须action和category同时匹配才能找到需要跳转的Activity,那么此时我们改改Manifest,然后你发现正常运行可以跳转了:

<activity android:name=".activity.FirstActivity" >            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>                <category android:name="android.intent.category.DEFAULT"/>            </intent-filter>        </activity>

可能会问,不是要action和category同时匹配吗,在跳转代码中intent没有设置category啊。那是因为默认会设置category.DEFAULT,所以我们不必再设置了,当然,我们还可以再另外添加category:

<activity android:name=".activity.FirstActivity" >            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>                <category android:name="android.intent.category.DEFAULT"/>                <category android:name="com.xjj.test.aaaa"/>            </intent-filter>        </activity>Intent intent = new Intent("com.xjj.test.FIRSTACTION");        intent.addCategory("com.xjj.test.aaaa");        startActivity(intent);

有个条件必须记住,跳转intent设置的category,配置文件中的activity必须都有,反过来就不是了,配置文件中设置的category,intent跳转的时候不必都有,只要intent设置了其中一个就可以进行跳转。举例说明:
1.配置文件中设置了两个category,intent只有一个(默认的DEFAULT):

<activity android:name=".activity.FirstActivity" >            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>                <category android:name="android.intent.category.DEFAULT"/>                <category android:name="com.xjj.test.aaaa"/>            </intent-filter>        </activity>Intent intent = new Intent("com.xjj.test.FIRSTACTION");        startActivity(intent);

运行,发现可以正常运行。
2.intent设置了2个category,配置文件中只有一个:

Intent intent = new Intent("com.xjj.test.FIRSTACTION");        intent.addCategory("com.xjj.test.aaaa");        startActivity(intent);<activity android:name=".activity.FirstActivity" >            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>                <category android:name="android.intent.category.DEFAULT"/>            </intent-filter>        </activity>

运行,发现程序崩溃,所以这说明category是以intent中的来进行筛选的,只有配置文件有intent中设置的所有category才满足条件,否则会报异常,找不到匹配的Activity。
再来看个例子,假设我多个Activity都满足intent的条件呢?

<activity android:name=".activity.FirstActivity" >            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>                <category android:name="android.intent.category.DEFAULT"/>                <category android:name="com.xjj.test.aaaa"/>            </intent-filter>        </activity>        <activity android:name=".activity.SecondActivity">            <intent-filter>                <action android:name="com.xjj.test.FIRSTACTION"/>                <category android:name="android.intent.category.DEFAULT"/>                <category android:name="com.xjj.test.aaaa"/>            </intent-filter>        </activity>Intent intent = new Intent("com.xjj.test.FIRSTACTION");        intent.addCategory("com.xjj.test.aaaa");        startActivity(intent);

执行,会发现会弹出选择框列出来了FirstActivity和SecondActivity,然后自己点击需要跳转的,有兴趣的可以自己动手试一试。

以上是隐式Intent来启动Activity的方法,其他非启动Activity我就不多费口舌了,大家应该用的很多了,比如拨打电话,打开浏览器浏览网页等。

0 0
原创粉丝点击