实验一. Intent 组件间通讯实验
实验目的
- 了解使用 Intent 启动 Activity 的方法;
- 掌握隐式Intent的使用方法;
- 掌握Intent调用启动其他应用程序的方法;
- 掌握获取 Activity 返回值的方法;
实验环境
- 硬件:CBT-EMB-MIP 实验平台,PC机;
- 软件:Android Studio;
实验内容
主要介绍使用 Intent 进行组件通信的原理,使用 Intent 启动 Activity 的方法,获取 Activity返回值的方法,Intent 过滤器的原理与匹配机制,发送和接收广播消息的方法。
实验原理
在 Android 系统中,应用程序一般都有多个 Activity,Intent 可以实现不同 Activity 之间的切换和数据传递,启动 Activity 方式,显式启动,必须在 Intent 中指明启动的 Activity 所在的类。隐式启动, Android系统根据Intent的动作和数据来决定启动哪一个Activity,也就是说在隐式启动时,Intent中只包含需要执行的动作和所包含的数据,而无需指明具体启动哪一个 Activity,选择权有 Android系统和最终用户来决定。
显式启动
使用 Intent显式启动Activity,创建一个 Intent,指定当前的应用程序上下文以及要启动的Activity把创建好的这个 Intent 作为参数传递给 startActivity()方法。
关键代码如下:
Intent intent = new Intent(IntentDemo.this, ActivityToStart.class);
startActivity(intent);
隐式启动
优点:不需要指明需要启动哪一个 Activity,而由 Android 系统来决定,有利于使用第三方组件。隐式启动 Activity 时,Android 系统在应用程序运行时解析 Intent,并根据一定的规则对 Intent 和Activity 进行匹配,使 Intent 上的动作、数据与 Activity 完全吻合。匹配的 Activity 可以是应用程序本身的,也可以是 Android 系统内置的,还可以是第三方应用程序提供的。因此,这种方式更加强调了 Android 应用程序中组件的可复用性。
默认情况下调用内置 Web 浏览器代码如下:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intent);
Intent 语法如下:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlString));
Activity中获取返回值
在很多情况下,后启动的 Activity 是为了让用户对特定信息进行选择,在关闭这个 Activity 后,用户的选择信息需要返回给未关闭的那个 Activity。按照 Activity 启动的先后顺序,先启动的称为父Activity,后启动的称为子 Activity。如果需要将子 Activity 的部分信息返回给父 Activity,则可以用光盘目录src\chapter03\experiment02\ActivityForResultDemo的方式去启动子 Activity。获取子 Activity 的返回值,一般可以分为以下三个步骤:
- 以ActivityForResultDemo 的方式启动子 Activity。
- 设置子 Activity 的返回值。
- 在父 Activity 中获取返回值。
以 ActivityForResultDemo 的方式启动子 Activity 代码如下:
public static final int REQUSET = 1;
Intent intent = new Intent(MainAcitvity.this,RequestActivity.class);
startActivityForResult(intent, REQUSET);
下面代码说明如何在子 Activity 中设置返回值:
public static final String KEY_USER_ID="KEY_USER_ID";
public static final String KEY_USER_PASSWORD="KEY_USER_PASSWORD";
Intent intent=new Intent();
intent.putExtra(KEY_USER_ID, et01.getText().toString());
intent.putExtra(KEY_USER_PASSWORD, et02.getText().toString());
setResult(RESULT_OK, intent);
finish();
在父 Activity 中获取返回值,当子 Activity 关闭时,启动它的父 Activity 的 onActivityResult()函数将被调用;如果需要在父 Activity 中处理子 Activity 的返回值,则重载此函数即可,此函数的语法如下:
public void onActivityResult(int requestCode, int resultCode, Intent data);
实验步骤
导入工程源码
- 打开Android Studio,从菜单栏选择 File > Open。
- 弹窗中浏览选择光盘src目录下的Gradle工程 CH03_SDK ,点击OK导入。
- 等待工程构建完成后,在工具栏中的Android App列表中选择本实验例程CH03_01_activityForResultDemo,点击运行安装。
- 之后切换到CH03_01_intent_Sample,点击运行安装。
演示运行
程序运行界面如图5.2.1所示:
图5.2.1
下面通过示例演示Intent的具体用法:
- 单击
查看www.baidu.com网站
按钮后,程序将调用默认内置Web浏览器打开相应网站如图5.2.2所示:
图5.2.2
本示例演示了隐式intent中访问某个网页URL的功能。
- 点击
显式的intent按钮跳转到Activity2界面
,如图5.2.3所示:
图5.2.3
- 点击
隐式的intent按钮跳转到Activity3界面
,如图5.2.4所示:
图5.2.4
代码实现如下:
Intent intent = new Intent();
intent.setAction("aaa");
startActivity(intent);
在配置文件AndroidManifest.xml中添加intent过滤器设置:
<activity
android:name="com.cbt.intentdemo.second"
android:label="second" >
<intent-filter>
<action android:name="aaa" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
4.点击启动其他应用ActivityForResultDemo的intent按钮
会启动另一个演示程序ActivityForResultDemo,如图5.2.5所示:
图5.2.5
- 单击
输入帐号
按钮启动到登录界面,提供帐号/密码2个输入框和一个登录
按钮如图5.2.6所示,在输入框输入信息后单击“登录”按钮,信息会被传递给父Activity,如图5.2.7所示。
图5.2.6
图5.2.7