You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:15:03