Android Java开发中如何在Shared Preferences中保存并更新状态?
1. 初始化SharedPreferences实例
首先获取应用私有模式的SharedPreferences实例,存储文件仅当前应用可访问:
// Kotlin 写法(Activity/Fragment 中调用) val sharedPref = getSharedPreferences("app_config", Context.MODE_PRIVATE)
// Java 写法 SharedPreferences sharedPref = getSharedPreferences("app_config", Context.MODE_PRIVATE);
第一个参数为存储的XML文件名,可自定义。
2. 登录成功后写入初始状态
用户登录验证通过后,将初始登录状态、视图状态写入SharedPreferences:
sharedPref.edit() .putBoolean("is_login", true) // 存储登录状态 .putBoolean("is_list_view", true) // 存储默认视图状态,示例为默认列表视图 .apply()
apply()为异步写入,不会阻塞主线程;如果需要确认写入结果,可替换为commit()同步写入,会返回布尔值表示写入是否成功。
3. 按钮点击切换并覆盖状态
给切换按钮设置点击事件,每次点击读取当前状态后计算新状态,直接写入覆盖即可:
SharedPreferences 对相同Key执行put操作时会自动覆盖旧值,无需额外做删除处理
toggleViewBtn.setOnClickListener { // 读取当前视图状态,第二个参数为读取失败时的默认值 val currentListViewState = sharedPref.getBoolean("is_list_view", true) val newListViewState = !currentListViewState // 覆盖写入新状态 sharedPref.edit() .putBoolean("is_list_view", newListViewState) .apply() // 刷新当前页面视图 refreshPageView(newListViewState) }
4. 页面启动时读取状态渲染
每次页面激活时读取存储的状态,直接渲染对应视图即可:
override fun onResume() { super.onResume() // 校验登录状态,未登录跳转登录页 val isLogin = sharedPref.getBoolean("is_login", false) if (!isLogin) { startActivity(Intent(this, LoginActivity::class.java)) finish() return } // 读取视图状态渲染页面 val currentViewState = sharedPref.getBoolean("is_list_view", true) refreshPageView(currentViewState) } // 自定义视图刷新方法,根据参数切换视图模式 private fun refreshPageView(isListView: Boolean) { if (isListView) { recyclerView.layoutManager = LinearLayoutManager(this) } else { recyclerView.layoutManager = GridLayoutManager(this, 2) } recyclerView.adapter?.notifyDataSetChanged() }
注意事项
- 不要使用
MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE等公开权限模式,会导致数据泄露,Android 7.0之后官方已经禁用这类模式 - SharedPreferences仅适合存储轻量KV数据,不要存入大对象、长文本等内容,会拖慢应用启动速度
- 多条数据同时修改时可批量提交,减少IO次数
内容的提问来源于stack exchange,提问作者abdul
相关产品推荐
相关产品推荐

