上一篇
安卓开发中数据的传递方式
- 行业动态
- 2025-04-22
- 7
安卓数据传递方式:Intent传参/Bundle携带、全局变量、事件总线、持久化存储(SP/DB)及接口回调
安卓开发中数据传递方式详解
Intent传递数据
适用场景:Activity之间、组件间(如Activity与Service)传递简单数据。
数据类型:基本类型、String、Parcelable对象、Serializable对象。
示例:
// 发送端 Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key", "value"); // 传递String startActivity(intent); // 接收端 String value = getIntent().getStringExtra("key");
特点:
- 仅支持小数据量(Intent有大小限制)。
- 数据随Intent生命周期结束而销毁。
Bundle传递数据
适用场景:Fragment与Activity之间、Fragment之间传递数据。
数据类型:类似Intent,支持基本类型、Parcelable/Serializable。
示例:
// 在Fragment中设置数据 Bundle bundle = new Bundle(); bundle.putString("key", "value"); fragment.setArguments(bundle); // 在目标Fragment中获取数据 String value = getArguments().getString("key");
特点:
- 通过
setArguments()
传递,数据在配置变化(如旋转屏幕)时保留。
- 通过
全局变量(单例模式)
适用场景:临时存储全局数据,跨组件共享。
数据类型:任意对象。
示例:
public class DataHolder { private static DataHolder instance = new DataHolder(); public String data; private DataHolder() {} public static DataHolder getInstance() { return instance; } } // 使用 DataHolder.getInstance().data = "value";
特点:
简单但易导致内存泄漏,需谨慎管理生命周期。
持久化存储
- 适用场景:需要长期保存数据(如用户偏好、缓存)。
- 数据类型:文件、SQLite数据库、SharedPreferences。
- 示例:
// SharedPreferences SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); sp.edit().putString("key", "value").apply(); // 存储 String value = sp.getString("key", ""); // 读取
- 特点:
数据持久化,应用关闭后仍存在。
ViewModel与LiveData
适用场景:同一Activity内的Fragment间通信,避免直接依赖。
数据类型:任意对象(推荐符合Parcelable规范)。
示例:
// 定义ViewModel public class MyViewModel extends ViewModel { public MutableLiveData<String> data = new MutableLiveData<>(); } // FragmentA设置数据 ViewModel viewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class); viewModel.data.setValue("value"); // FragmentB观察数据 viewModel.data.observe(getViewLifecycleOwner(), value -> { // 处理value });
特点:
生命周期安全,数据在配置变化时自动保留。
EventBus(事件总线)
适用场景:解耦组件间通信,如Activity与Fragment、后台线程与UI。
数据类型:任意对象(需实现
PostThread
规范)。示例:
// 发送事件 EventBus.getDefault().post(new MessageEvent("data")); // 接收事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { // 处理event.data }
特点:
- 依赖第三方库(如
greenrobot.eventbus
),适合复杂场景。
- 依赖第三方库(如
数据传递方式对比表
方式 | 适用场景 | 数据类型限制 | 生命周期影响 | 性能开销 |
---|---|---|---|---|
Intent | Activity/组件间 | 小数据量、Parcelable | 无 | 低 |
Bundle | Fragment与Activity间 | 同Intent | 配置变化保留 | 低 |
全局变量 | 全局临时数据 | 无限制 | 易泄漏 | 中等 |
SharedPreferences | 持久化配置 | 键值对 | 持久化 | 低 |
ViewModel | 同一Activity内的Fragment通信 | 任意对象 | 生命周期安全 | 中等 |
EventBus | 解耦复杂组件通信 | 任意对象 | 无 | 较高 |
相关问题与解答
问题1:如何选择数据传递方式?
- 解答:
- 小数据量且短期使用:优先Intent或Bundle。
- 跨组件或需解耦:使用EventBus。
- 同一Activity内Fragment通信:推荐ViewModel。
- 持久化需求:选择SharedPreferences或数据库。
问题2:如何传递复杂对象(如自定义类)?
- 解答:
- 实现Parcelable接口:
public class User implements Parcelable { String name; // 必须实现contentDescribe()和writeToParcel()方法 }
- 通过Intent传递:
Intent intent = new Intent(); intent.putExtra("user", user); // user为Parcelable对象
- 替代方案:使用全局变量或ViewModel存储对象引用
- 实现Parcelable接口: