原理:通过静态内部类或枚举实现单例对象,提供全局访问入口。
优点:
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; } }
原理:基于观察者模式的事件发布/订阅框架(如GreenRobot EventBus)。
优点:
原理:通过Lifecycle感知型组件管理数据,支持生命周期安全更新。
优点:
class AppViewModel : ViewModel() { val userInfo = MutableLiveData<User>() // 其他数据... }
原理:在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) { // 插入数据 } }
A:
ViewModel
配合Service
绑定(需注意生命周期绑定) EventBus
发布事件到Service LiveData
结合LifecycleService
(AndroidX组件)ViewModel
+ ServiceBinding
,确保服务销毁时自动清理数据。A:
| 需求 | 推荐方案 | 理由 |
|———————|————————|——————————-|
| 简单键值存储 | MMKV/DataStore | 高性能、轻量级 |
| 结构化数据持久化 | Room数据库 | 支持复杂查询、关系型数据 |
| 跨进程持久化 | ContentProvider | 系统级支持,兼容多进程访问 |
| 加密敏感数据 | EncryptedSharedPreferences | 内置加密机制