如何恢复application level变量?savedInstanceState仅支持Activity与Fragment场景
解决方案
针对你描述的*系统主动销毁应用进程(非用户手动杀死)*的场景,Android本身提供了原生的状态恢复机制,无需依赖SharedPreference或数据库即可实现Application级变量的恢复,常用方案如下:
方案1:通过Activity的onSaveInstanceState承载全局状态快照
系统在主动销毁应用进程前,一定会回调当前栈顶Activity的onSaveInstanceState(Bundle outState)方法,你可以在这个回调里将需要保留的Application级变量序列化后存入传入的Bundle对象:
// 栈顶Activity内的代码 override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 保存Application级变量到Bundle outState.putString("global_user_id", (application as MyApp).globalUserId) outState.putInt("global_unread_count", (application as MyApp).globalUnreadCount) }
下次进程重建、Activity被重新初始化时,从onCreate的savedInstanceState参数中读取数据,重新赋值给Application的对应变量即可:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState != null) { // 恢复Application级变量 (application as MyApp).globalUserId = savedInstanceState.getString("global_user_id") (application as MyApp).globalUnreadCount = savedInstanceState.getInt("global_unread_count") } }
注意:该方案存储的总数据大小不要超过1MB,否则会触发
TransactionTooLargeException。
方案2:使用Jetpack Saved State Module配合全局共享ViewModel
如果需要更简洁的封装,可以引入Jetpack的Saved State组件,将需要全局留存的状态存入带SavedStateHandle参数的全局共享ViewModel中:
- 首先引入依赖(build.gradle)
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2" }
- 定义全局共享ViewModel,内部使用SavedStateHolder保存状态
class GlobalViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { // 从SavedStateHandle读写全局变量,系统杀进程时会自动持久化 var globalUserId: String? get() = savedStateHandle["global_user_id"] set(value) { savedStateHandle["global_user_id"] = value // 同步赋值给Application变量 (getApplication<MyApp>()).globalUserId = value } }
- 进程重建后,直接从ViewModel中读取已自动恢复的状态,赋值给Application变量即可。
适配性说明
上述两种方案都仅覆盖系统因内存不足、配置变更等原因主动销毁进程的场景,用户手动从最近任务列表划掉应用时,系统会自动清空所有savedInstanceState相关的数据,刚好符合你“用户主动杀死应用无需恢复”的要求。
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

