- 存储简单的键值对数据
- 适用于存储用户设置、登录状态等小型数据
- 数据保存在XML文件中,位于应用私有目录下
优点:
- 简单易用:API简洁直观,无需复杂配置
- 键值对存储:适合存储简单数据结构
- 持久化存储:应用重启后数据依然保留
- 类型安全:专门针对基本数据类型(Boolean, Int, String等)提供方法
- 轻量级:资源消耗少,操作快速
- 应用私有:存储安全,其他应用无法访问
- 异步操作支持:通过apply()方法支持非阻塞写入
适用场景:
- 用户偏好设置:主题、字体大小、语言等UI首选项
- 应用状态:是否首次运行、向导是否完成等
- 用户登录状态:保存登录凭证、记住密码选项
- 简单缓存:上次刷新时间、已读状态等
- 配置信息:服务器URL、API版本、特性开关等
- 少量游戏数据:分数记录、解锁成就等
- 简单表单数据:记住用户输入的非敏感信息
代码示例:
实现用户登录信息的保存和读取功能
- 保存数据:当用户勾选"记住我"并点击登录时,会保存用户名和密码到 SharedPreferences
- 自动加载:当再次打开应用时,如果之前保存过数据,会自动填充用户名和密码
- 清除数据:点击"清除数据"按钮会删除所有保存的信息
MainActivity
package com.software.storageprac
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.software.storageprac.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
// 在onCreate中初始化SharedPreferences
sharedPreferences = getSharedPreferences("myPrefs", MODE_PRIVATE)
loadSaveData()
initClickListener()
}
private fun handleLogin() {
val username = binding.edtUsername.text.toString()
val password = binding.edtPassword.text.toString()
if (binding.cbRemember.isChecked) {
sharedPreferences.edit().apply {
putString("username", username)
putString("password", password)
putBoolean("remember_me", true)
apply()
}
Toast.makeText(this, "信息已保存", Toast.LENGTH_SHORT).show()
} else {
sharedPreferences.edit().clear().apply()
Toast.makeText(this, "信息已清除", Toast.LENGTH_SHORT).show()
}
}
private fun clearData() {
sharedPreferences.edit().clear().apply()
binding.edtUsername.text.clear()
binding.edtPassword.text.clear()
binding.cbRemember.isChecked = false
Toast.makeText(this, "数据已清除", Toast.LENGTH_SHORT).show()
}
private fun initClickListener() {
binding.btnLogin.setOnClickListener {
handleLogin()
}
binding.btnClear.setOnClickListener {
clearData()
}
}
private fun loadSaveData() {
val rememberMe = sharedPreferences.getBoolean("remember_me", false)
if (rememberMe) {
binding.edtUsername.setText(sharedPreferences.getString("username", ""))
binding.edtPassword.setText(sharedPreferences.getString("password", ""))
binding.cbRemember.isChecked = true
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center">
<EditText
android:id="@+id/edtUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名"/>
<EditText
android:id="@+id/edtPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:inputType="textPassword"/>
<CheckBox
android:id="@+id/cbRemember"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住我"/>
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录"/>
<Button
android:id="@+id/btnClear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="清除数据"/>
</LinearLayout>
注意不要在Activity的构造阶段就调用了getSharedPreferences,会引起空指针异常
效果查看:
看网络中好多说是在Device Explorer这里查看,但是我发现会有问题,/data/data/ 目录包含所有应用的私有数据,包括SharedPreferences、数据库等,直接查看会有限制,像这种
所以我选择了另一种方式查看存储在sharedPreferences的内容
使用adb工具,ADB可以使用特殊的run-as命令获得你自己应用的临时访问权限,但仍然只限于开发者访问自己的应用数据。
adb shell run-as com.software.storageprac cat /data/data/com.software.storageprac/shared_prefs/myPrefs.xml
然后就能查看到了
目录