深入理解Android意图与意图过滤器
立即解锁
发布时间: 2025-08-24 00:12:34 阅读量: 1 订阅数: 4 


Android App Development for Beginners
# 深入理解 Android 意图与意图过滤器
## 一、Intent 对象的重要参数
### 1. 类别(Category)
Intent 对象的另一个重要参数是类别,它用于提供关于指定执行动作的额外或更精细的信息。不同的动作对类别的使用效果不同。例如,通过 Intent 对象启动用户 Android 手机的主屏幕,使用动作常量 `ACTION_MAIN` 和类别常量 `CATEGORY_HOME`,Android 就会启动手机的主屏幕并显示出来。
### 2. 额外数据(Extras)
额外数据参数允许通过 Intent 对象将额外的数据字段传递给活动、服务或广播接收器。该参数使用 `Bundle` 对象来传递一组数据对象,这是一种巧妙的方式,可以将任何额外的数据或更复杂的数据结构与动作请求/消息一起传递。
## 二、Intent 解析:隐式意图和显式意图
### 1. 显式意图(Explicit Intents)
显式意图通过 `ComponentName` 数据字段使用 Intent 对象的组件部分。通常在开发自己的应用程序时使用,因为开发者知道哪些包和类适合接收 Intent 对象发送的动作消息和数据。由于组件是明确指定的,这种类型的意图更安全,解释时不会出错。最佳编程实践要求对代码进行详细文档记录,以便其他使用意图代码的程序员获得正确的组件名称信息。但在现实中,这种理想情况并不总是发生,因此 Android 也有隐式意图和意图过滤器来处理其他情况。
显式意图更适合用于私有应用间通信。如果指定了组件名称,在确定哪个代码处理意图解析时,它将覆盖 Intent 对象的其他部分。指定组件有两种方式:
- 使用 `setComponent()` 方法,该方法使用 `ComponentName` 对象:
```java
.setComponent(ComponentName);
```
- 使用 `setClass(Context, Class)` 方法提供处理意图的确切类。有时这是意图中唯一的信息,特别是当使用意图的预期结果只是在用户需要时启动应用程序内部的并行活动时。
### 2. 隐式意图(Implicit Intents)
隐式意图是指在意图对象中未指定组件的意图。这意味着 Android 必须从意图对象的其他参数推断出需要将意图消息传递给哪个代码以进行成功处理。
Android 基于对 `AndroidManifest.xml` 文件中各种动作、数据和类别的比较进行推断。意图过滤器使用 `<intent-filter>` 标签在 `AndroidManifest.xml` 中定义,它提供了需要匹配的意图对象结构的描述以及在遇到多个匹配时使用的优先级属性。如果未指定动作过滤器,则不会测试意图的动作参数,转而测试意图的数据参数。如果未指定数据过滤器,则仅匹配不包含数据的意图。
例如,以下是 `AndroidManifest.xml` 文件中的一个意图过滤器定义,指定可以通过 HTTP 从互联网检索 MPEG4 视频和 MPEG3 音频:
```xml
<intent-filter>
<data android:mimeType="video/mp4" android:scheme="http" />
<data android:mimeType="audio/mp3" android:scheme="http" />
</intent-filter>
```
基于数据特征的意图过滤,数据参数可分为四个子类别:
| 子类别 | 描述 | 示例 |
| ---- | ---- | ---- |
| 数据类型(Data type) | MIME 数据类型 | image/jpeg 或 audio/mp3 |
| 数据方案(Data scheme) | 格式为 scheme://host:port/path | content://com.apress.project:300/datafolder/files/file1 |
| 数据权限(Data authority) | 服务器主机和服务器端口 | com.apress.project:300 |
| 数据路径(Data path) | 数据位置的地址 | http://www.apress.com/datafolder/file1.jpg |
## 三、使用意图切换活动
### 1. 创建项目
- 关闭 `ContentProviders` 项目文件夹(右键单击并选择“关闭项目”)。
- 创建一个新的 `IntentFilters` Android 项目,参数如下:
- 项目名称:`IntentFilters`
- 应用名称:`IntentFilters`
- 包名:`seventh.example.intentfilters`
- 创建自定义启动器图标:选中
- 构建目标:Android 4.1(API 16)
- 最低 SDK 版本:Android 2.2(API 8)
### 2. 创建第二个活动类
- 右键单击 `IntentFilters` 文件夹,选择“新建” -> “类”,打开一个对话框,在与 `MainActivity.java` 类相同的文件夹中创建一个新的 Java 活动类。
- 如果右键单击 `IntentFilters` 文件夹进行“新建” -> “类”操作,对话框的第一个字段会自动填充,源文件夹字段设置为 `IntentFilters/src`。
- 在第二个字段中,可以输入在新建 Android 应用项目对话框中创建的 `seventh.example.intentfilters` 包名,也可以点击字段右侧的“浏览”按钮,从列表底部选择该包。
- 填写“名称”字段,使用 `AlternateActivity` 作为类名。
- 保持修饰符不变,因为要创建一个活动类,需要扩展超类 `android.app.Activity`。
### 3. 创建第一个活动的用户界面
#### 扩展 `TextView` 标签
- 在 `strings.xml` 文件中创建 `main_activity_text`,文本值设置为:“You Are Currently in the MainActivity”,或者编辑 `hello world` 字符串标签以达到相同目的。
- 使用 `android:text` 属性通过 `“@string/main_activity_button”` 设置指向 `strings.xml` 文件的值。
- 使用 `android:textSize` 属性将文本大小增加到 18 设备独立像素,可通过 Eclipse 右侧的属性标签进行设置。
- 使用 `android:centerHorizontal="true"` 属性将文本标题居中显示在屏幕顶部,删除 `android:centerVertical` 参数将 `TextView` 放置在 UI 屏幕顶部。
```xml
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:centerHorizontal="true"
android:text="@string/main_activity_text"
android:textSize="18dp"
tools:context=".MainActivity" />
```
#### 添加 `Button` 标签
- 在 `strings.xml` 文件中创建 `main_activity_button`,文本值设置为:“Go To the Alternate Activity to use a Digital Clock”。
- 设置 `layout_below` 属性为 `“@+id/textView1”`,使按钮位于 `TextView` 下方。
- 使用 `android:centerHorizontal="true"` 确保按钮居中。
- 使用 `android:layout_marginTop="30dp"` 使按钮向下间隔一点。
```xml
<Button
```
0
0
复制全文
相关推荐








