Intent(意图)是Android中用于组件间通信的核心机制,它封装了一次操作的“动作”和“数据”,并可携带附加信息,帮助系统或开发者找到合适的组件来处理该操作。
组成部分 | 说明 |
---|---|
Action | 动作标识(如ACTION_VIEW ),指定要执行的操作类型。 |
Data | 数据URI(如content://contacts/1 ),指向操作的具体数据。 |
Category | 类别标签(如CATEGORY_DEFAULT ),补充说明Intent的用途或场景。 |
Extras | 附加键值对数据,用于传递额外信息(如字符串、布尔值等)。 |
Component | 显式指定目标组件(类名),非必需(隐式Intent时由系统匹配)。 |
Intent intent = new Intent(this, TargetActivity.class); startActivity(intent);
Action
、Data
、Category
让系统匹配符合条件的组件。 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://example.com")); startActivity(intent);
场景 | 说明 |
---|---|
启动Activity | 显式Intent:跳转到指定页面;隐式Intent:由系统选择合适应用处理。 |
启动Service | 通过startService() 或bindService() 传递Intent。 |
发送广播 | 通过sendBroadcast() 传递Intent,其他应用可监听并处理。 |
应用间数据共享 | 通过putExtra() 传递数据,或结合ContentProvider 操作跨应用数据。 |
通过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-filter>
中的action
需与Intent的action
一致。 category
必须匹配。 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>
解答:
隐式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(如浏览器)。
解答:
Intent的Extras
仅支持基本数据类型或Parcelable
/Serializable
对象,传递自定义对象需实现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);