实验一. 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);

实验步骤

导入工程源码

  1. 打开Android Studio,从菜单栏选择 File > Open
  2. 弹窗中浏览选择光盘src目录下的Gradle工程 CH03_SDK ,点击OK导入。
  3. 等待工程构建完成后,在工具栏中的Android App列表中选择本实验例程CH03_01_activityForResultDemo,点击运行安装。
  4. 之后切换到CH03_01_intent_Sample,点击运行安装。

演示运行

程序运行界面如图5.2.1所示:

图5.2.1

下面通过示例演示Intent的具体用法:

  1. 单击查看www.baidu.com网站按钮后,程序将调用默认内置Web浏览器打开相应网站如图5.2.2所示:

图5.2.2

本示例演示了隐式intent中访问某个网页URL的功能。

  1. 点击显式的intent按钮跳转到Activity2界面,如图5.2.3所示:

图5.2.3

  1. 点击隐式的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

  1. 单击输入帐号按钮启动到登录界面,提供帐号/密码2个输入框和一个登录按钮如图5.2.6所示,在输入框输入信息后单击“登录”按钮,信息会被传递给父Activity,如图5.2.7所示。

图5.2.6

图5.2.7

results matching ""

    No results matching ""