Android培训(一)开始篇07之 App的交互类Intent

本章介绍App之间交互的一个非常重要的类--Intent。

目录
第1部分 给其他程序发消息
第2部分 接收其他程序的消息
第3部分 获取其他程序的返回结果

第1部分 给其他程序发消息

1. Intent种类

Intent包括两种:显式Intent 和 隐式Intent。

1.1 显式Intent

显式Intent是直接在Intent中指明要接受消息的类。如下两种方式都是显式Intent。

private void jump1() {
    Intent intent = new Intent(this, DestinationActivity.class);
    startActivity(intent);
}   


private void jump2() {
    Intent intent = new Intent();
    ComponentName component = new ComponentName("com.skw.jumptest", "com.skw.jumptest.DestinationActivity");
    intent.setComponent(component);
    startActivity(intent);
}   

点击查看:显式Intent实例的源码

1.2 隐式Intent

隐式Intent就是不指明接收Intent的类,而通过在Intent中包含Action等信息来将Intent消息发送给接收相应Action的类。

private static final String ACTION_JUMP = "com.skw.jumptest.JumpAction";

private void jump() {
    Intent intent = new Intent(ACTION_JUMP);
    startActivity(intent);
}   

说明:上面就是一个通过包含Action的Intent来发送消息的例子。需要格外注意的是,接受该Action的类,在定义的时候,manifest中需要添加"android.intent.category.DEFAULT"这个Category。下面是接收ACTION_JUMP的类在manifest中的声明。

<activity android:name="DestinationActivity" >
    <intent-filter>
        <action android:name="com.skw.jumptest.JumpAction" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

点击查看:隐式Intent实例的源码

2. Intent传递数据

下面讲解Intent传递数据的方式。Intent传递数据,可以指定Component,Action,Data,Type,Extras和Category等几种数据

2.1 ComponentName

用于明确指定Intent的类名。这个在显式Intent时已经演示过。

2.2 Action

用于指定Intent的动作。这个在隐式Intent时已经演示过。

2.3 Data

用于指定Intent的数据,该数据一般用Uri封装。下面,介绍几组 action/data的示例:

ACTION_VIEW content://contacts/people/1 -- 进入联系人查看界面,并显式id为1的联系人的信息。
ACTION_EDIT content://contacts/people/1 -- 进入联系人编辑界面,并编辑id为1的联系人的信息。
ACTION_DIAL content://contacts/people/1 -- 进入拨号程序,并输入id为1的联系人的号码。

2.4 Type

用于指定要操作的intent数据类型。通常在data中就暗含了type类型。通过设置intent的type,我们能过滤掉type不同的intent。如mp4对应的type是"video/mp4",mp3的type为“audio/x-mpeg”。

2.5 Extras

设置intent的附加数据,通常用来传递除“data”和“type”之外的额外内容。例如:boolean、int等基本类型数据或它们对应的数组、bundle对象、以及parcelable或seriable对象

2.6 Category

附加到action上的额外信息。例如“android.intent.category.LAUNCHER”表示将该activity的图标在主界面的程序列表中显示,“android.intent.category.DEFAULT”是通过隐式intents来查找该类的必备属性。

点击查看:Intent传递数据的源码

3. Intent是否被接收

如果发送的Intent没有被接收的话,程序会崩溃。可以使用下面的语句对Intent是否被接收进行确认!

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;

点击查看:Intent是否被接收的源码

4. Intent选择框

可以通过以下语句弹出Intent的选择框,并设置该选择框的标题。

String title = getResources().getString(R.string.chooser_title);
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

说明:实际上,不明确指定选择框,而直接使用startActivity()的话,也会弹出选择框。它们的区别就是,自定义的选择框,能自定义标题等内容。

点击查看:Intent选择框测试源码

第2部分 接收其他程序的消息

一个Activity若要接收Intent消息,需要定义它的IntentFilter。具体的做法是,在该Activity对应的manifest中声明它需要接受的Intent。

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>

说明:上面是一个Activity对应的定义。它接收"android.intent.action.SEND"消息,该消息通常用于共享;例如,像Google+、微信等程序提供的共享服务。

(01) "android.intent.action.SEND" -- 定义该Activity接收的消息。
(02) "android.intent.category.DEFAULT" -- 说明该Activity接收隐式消息。它是该Activity接受隐式消息所必须的!如果不带该属性,则该Activity无法接收隐式消息。
(03) "text/plain"和"image/*" -- 说明该Activity接收文本以及图片类的消息。

点击查看:接收其他程序消息的测试源码

第3部分 获取其他程序的返回结果

在发送一个Intent消息之后,我们可能需要获取其他Intent消息的返回结果。例如,进入联系人列表界面选择一个联系人后返回该联系人。

Android提供了设置/获取Intent返回消息的相应接口,下面对涉及到的接口进行介绍:

(01) startActivityForResult(Intent intent, int requestCode)
说明:它的作用是启动其他的Activity,并设置请求码(requestCode)。resultCode的作用是对Intent请求进行分类,因为该Activity可能有多个Intent请求。
位置:Intent请求发送方。

(02) setResult(int resultCode, Intent data)
说明:它的作用是设置返回结果。包括返回码(resultCode)和返回数据(Intent)。resultCode通常用于记录该Intent请求处理是否成功,而Intent用于发送额外的数据。
位置:Intent请求接收方。

(03) onActivityResult(int requestCode, int resultCode, Intent data)
说明:它的作用是根据请求码(resultCode)进行相应的处理。
位置:Intent请求发送方。

点击查看:获取其他程序的返回结果的测试源码

by skywang
Previous     Next