使用 Intent 传递对象的几种方式(Android)

在 Android 开发中,Intent 是启动 Activity、Service 等组件的关键工具,同时也是在组件间传递数据的重要桥梁。

本文介绍如何通过 Intent 安全、高效地传递自定义对象,包括:

  • Serializable 方式
  • Parcelable 方式(推荐)
  • 使用 Bundle 传递对象
  • JSON 字符串传递对象(配合 Gson 等库)

1. 使用 Serializable 接口(简单但性能较差)

步骤 1:让类实现 Serializable

1
2
3
import java.io.Serializable

data class User(val name: String, val age: Int) : Serializable

步骤 2:通过 Intent 传递

发送端:

1
2
3
4
val user = User("Alice", 25)
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", user)
startActivity(intent)

接收端:

1
val user = intent.getSerializableExtra("user") as? User

优点: 简单,适合快速测试
缺点: 性能差,不适合大对象或频繁传递


2. 使用 Parcelable 接口(推荐方式)

步骤 1:实现 Parcelable

Kotlin 使用插件自动生成非常方便:

1
2
@Parcelize
data class User(val name: String, val age: Int) : Parcelable

需要在 build.gradle 中启用:

1
2
3
plugins {
id 'kotlin-parcelize'
}

步骤 2:通过 Intent 传递

发送端:

1
2
3
4
val user = User("Bob", 30)
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", user)
startActivity(intent)

接收端:

1
val user = intent.getParcelableExtra<User>("user")

优点: 高性能、Android 原生支持
适用场景: 数据类、列表对象、频繁传递的数据结构


3. 使用 Bundle 传递对象

可以将对象先封装进 Bundle,再通过 Intent 传递:

1
2
3
val bundle = Bundle()
bundle.putParcelable("user", user) // user 为 Parcelable 对象
intent.putExtras(bundle)

接收:

1
val user = intent.extras?.getParcelable<User>("user")

适合需要封装多个参数或复用 Bundle 的场景。


4. 使用 JSON 字符串传递对象(跨模块推荐)

适用于不能使用 Parcelable 的场景(如跨模块传输、第三方库对象等):

使用 Gson:

1
2
val json = Gson().toJson(user)
intent.putExtra("user_json", json)

接收端:

1
2
val json = intent.getStringExtra("user_json")
val user = Gson().fromJson(json, User::class.java)

优点: 灵活,适合传输复杂结构
缺点: 需要额外序列化/反序列化,性能略低


小结

方法 是否推荐 特点
Serializable ❌ 不推荐 实现简单,性能差
Parcelable ✅ 推荐 官方推荐,高效
Bundle ✅ 推荐 可组合多个参数
JSON 字符串 ✅ 特殊场景推荐 灵活,适合跨模块或跨平台

最佳实践

  • 数据类使用 @Parcelize 自动生成 Parcelable,最简洁
  • 跨模块或使用非自定义类时使用 JSON 字符串
  • 避免在 Intent 中传递过大的对象(>1MB),会引发异常
  • 在多参数传递时,推荐使用 Bundle 封装