Android使用onSaveInstanceState无法在重启应用后保留count变量问题求助
根因说明
onSaveInstanceState 和 onRestoreInstanceState 仅用于处理屏幕旋转、系统后台回收Activity这类临时的Activity销毁场景,其存储的Bundle数据生命周期和应用进程绑定。当用户主动关闭应用、进程被清理后,这部分数据会同步清除,因此重启应用后count会重置为初始值0。
解决方案
要实现应用重启后仍能读取到历史count值,需要使用持久化存储方案,针对这类轻量的键值对数据,推荐使用Android原生的SharedPreferences实现,数据会写入应用本地文件,不受进程销毁影响,修改后的实现代码如下:
var count = 0 // 自定义SharedPreferences存储文件名和对应key private val SP_FILE_NAME = "app_local_config" private val COUNT_KEY = "hola" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 优先读取本地持久化存储的count值 val sp = getSharedPreferences(SP_FILE_NAME, MODE_PRIVATE) count = sp.getInt(COUNT_KEY, 0) // 原有横竖屏切换的状态恢复逻辑可保留,也可删除,本地已存储最新值 if(savedInstanceState != null){ Log.d("chola","chola") count = savedInstanceState.getInt(COUNT_KEY) } Log.d("dola","dola") show() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) Log.d("hola","hola") outState.putInt(COUNT_KEY,count) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) Log.d("chola","chola") count = savedInstanceState.getInt(COUNT_KEY) } // 将最新count值持久化写入本地 private fun saveCount() { val sp = getSharedPreferences(SP_FILE_NAME, MODE_PRIVATE) sp.edit().putInt(COUNT_KEY, count).apply() } // Activity退到后台时自动保存最新值 override fun onPause() { super.onPause() saveCount() } private fun show(){ tv1.setText(count.toString()) }
补充说明
如果count是用户操作后实时更新的(比如点击按钮计数),可以在每次修改count值后主动调用一次saveCount(),避免进程意外被杀死时丢失最新数据。如果后续有更复杂的持久化需求,也可替换为Jetpack DataStore或Room数据库实现。
内容的提问来源于stack exchange,提问作者Rajdeep Das
相关产品推荐
相关产品推荐

