上一篇
安卓开发动态数据全局共享
- 行业动态
- 2025-04-22
- 3
常见全局数据共享方案
单例模式(Singleton)
原理:通过静态内部类或枚举实现单例对象,提供全局访问入口。
优点:
- 实现简单,无需依赖第三方库
- 可存储任意类型数据
缺点: - 易导致内存泄漏(持有Activity/Fragment引用时)
- 多线程需手动加锁
- 不符合Android生命周期管理
适用场景:简单数据共享,无复杂生命周期需求的场景
public class DataHolder { private static final DataHolder INSTANCE = new DataHolder(); private String data; private DataHolder() {} public static DataHolder getInstance() { return INSTANCE; } public void setData(String data) { this.data = data; } public String getData() { return data; } }
EventBus
原理:基于观察者模式的事件发布/订阅框架(如GreenRobot EventBus)。
优点:
- 解耦组件间依赖
- 支持线程切换
- 支持粘性事件
缺点: - 事件类型需严格匹配
- 调试困难(事件流向不直观)
- 0+版本需手动注册/注销
适用场景:组件间事件通信(非持续数据存储)
ViewModel + LiveData
原理:通过Lifecycle感知型组件管理数据,支持生命周期安全更新。
优点:
- 自动处理生命周期(避免内存泄漏)
- 数据变化通知观察者
- 支持多层级数据共享(Activity/Fragment共享)
缺点: - 仅适用于可观察数据
- 需配合Lifecycle组件使用
适用场景:UI相关数据的全局共享(如用户信息、网络状态)
class AppViewModel : ViewModel() { val userInfo = MutableLiveData<User>() // 其他数据... }
自定义Application类
原理:在Application中定义全局变量,通过(App)getApplication()
访问。
优点:
- 应用级别生命周期
- 实现简单
缺点: - 需手动管理线程安全
- 不适合复杂数据结构
适用场景:轻量级全局配置(如用户登录态、主题设置)
方案对比表格
方案 | 线程安全 | 生命周期管理 | 跨进程支持 | 数据持久化 | 典型场景 |
---|---|---|---|---|---|
单例模式 | 需手动处理 | 无 | 否 | 否 | 临时数据共享 |
EventBus | 支持配置 | 无 | 否 | 否 | 事件通知 |
ViewModel | 自动处理 | 自动绑定 | 否 | 否 | UI数据同步 |
ContentProvider | 系统处理 | 无 | 是 | 是 | 多进程数据共享 |
DataStore | 自动处理 | 无 | 否 | 是 | 偏好设置持久化 |
特殊场景解决方案
多线程安全处理
方案:使用
Mutex
/synchronized
或原子类(如AtomicInteger
)示例:
class SafeDataHolder { private val lock = Any() var data: String = "" fun setData(value: String) { synchronized(lock) { data = value } } }
跨进程数据共享
方案:通过
ContentProvider
或AIDL
实现Binder通信示例:
// 定义ContentProvider public class MyProvider extends ContentProvider { private static Map<String, String> dataMap = new HashMap<>(); @Override public Cursor query(Uri uri, String[] projection, Bundle queryArgs) { // 返回数据游标 } @Override public Uri insert(Uri uri, ContentValues values) { // 插入数据 } }
相关问题与解答
Q1:如何在保活服务中共享动态数据?
A:
- 使用
ViewModel
配合Service
绑定(需注意生命周期绑定) - 通过
EventBus
发布事件到Service - 使用
LiveData
结合LifecycleService
(AndroidX组件)
推荐方案:ViewModel
+ServiceBinding
,确保服务销毁时自动清理数据。
Q2:全局数据需要持久化时如何选择?
A:
| 需求 | 推荐方案 | 理由 |
|———————|————————|——————————-|
| 简单键值存储 | MMKV/DataStore | 高性能、轻量级 |
| 结构化数据持久化 | Room数据库 | 支持复杂查询、关系型数据 |
| 跨进程持久化 | ContentProvider | 系统级支持,兼容多进程访问 |
| 加密敏感数据 | EncryptedSharedPreferences | 内置加密机制