上一篇
安卓基础之Intent的概念及应用
- 行业动态
- 2025-04-22
- 4
Intent是Android组件通信的载体,分显式与隐式,用于启动活动、服务或广播,传递数据,实现跨组件交互,如startActivity启动新界
Intent的概念
Intent(意图)是Android中用于组件间通信的核心机制,它封装了一次操作的“动作”和“数据”,并可携带附加信息,帮助系统或开发者找到合适的组件来处理该操作。
- 核心作用:解耦组件,允许不同应用或同一应用内的组件通过“意图”交互。
- 本质:一种消息对象,描述“要做什么”而非“怎么做”。
Intent的组成部分
组成部分 | 说明 |
---|---|
Action | 动作标识(如ACTION_VIEW ),指定要执行的操作类型。 |
Data | 数据URI(如content://contacts/1 ),指向操作的具体数据。 |
Category | 类别标签(如CATEGORY_DEFAULT ),补充说明Intent的用途或场景。 |
Extras | 附加键值对数据,用于传递额外信息(如字符串、布尔值等)。 |
Component | 显式指定目标组件(类名),非必需(隐式Intent时由系统匹配)。 |
Intent的分类
显式Intent(Explicit Intent)
- 定义:明确指定目标组件的类名。
- 用途:在同一应用内启动特定组件(如Activity、Service)。
- 示例:
Intent intent = new Intent(this, TargetActivity.class); startActivity(intent);
隐式Intent(Implicit Intent)
- 定义:不指定目标组件,通过
Action
、Data
、Category
让系统匹配符合条件的组件。 - 用途:跨应用交互(如打开浏览器、分享内容)。
- 示例:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://example.com")); startActivity(intent);
Intent的典型应用场景
场景 | 说明 |
---|---|
启动Activity | 显式Intent:跳转到指定页面;隐式Intent:由系统选择合适应用处理。 |
启动Service | 通过startService() 或bindService() 传递Intent。 |
发送广播 | 通过sendBroadcast() 传递Intent,其他应用可监听并处理。 |
应用间数据共享 | 通过putExtra() 传递数据,或结合ContentProvider 操作跨应用数据。 |
Intent的数据传递
通过Extras传递数据:
// 添加数据 intent.putExtra("key", "value"); intent.putExtra("number", 123); // 获取数据 String value = intent.getStringExtra("key"); int number = intent.getIntExtra("number", defaultValue);
通过Data传递URI:
intent.setData(Uri.parse("file:///sdcard/test.txt"));
隐式Intent的匹配规则
系统通过以下条件匹配目标组件:
- Action匹配:组件声明的
<intent-filter>
中的action
需与Intent的action
一致。 - Category匹配:所有
category
必须匹配。 - Data匹配:
scheme
、authority
、path
需符合组件声明的格式。
示例:在Manifest中声明支持隐式Intent
<activity android:name=".TargetActivity"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="http"/> </intent-filter> </activity>
常见问题与解答
问题1:什么是隐式Intent?如何实现跨应用打开网页?
解答:
隐式Intent不指定目标组件,而是通过Action
、Data
、Category
让系统匹配符合条件的组件,打开网页的代码如下:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://www.example.com")); startActivity(intent);
系统会自动找到能处理ACTION_VIEW
且支持http
协议的Activity(如浏览器)。
问题2:如何通过Intent传递复杂对象(如自定义对象)?
解答:
Intent的Extras
仅支持基本数据类型或Parcelable
/Serializable
对象,传递自定义对象需实现Parcelable
接口:
- 实现Parcelable:
public class User implements Parcelable { String name; int age; // 构造方法、get/set方法省略 @Override public Parcelable writeToParcel(Parcel parcel, int flags) { parcel.writeString(name); parcel.writeInt(age); return this; } public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { @Override public User createFromParcel(Parcel parcel) { return new User(parcel); } @Override public User[] newArray(int size) { return new User[size]; } }; private User(Parcel parcel) { name = parcel.readString(); age = parcel.readInt(); } }
- 传递对象:
User user = new User("Alice", 25); intent.putExtra("user", user);