安卓五大存储之SharedPreferences

  • 存储简单的键值对数据
  • 适用于存储用户设置、登录状态等小型数据
  • 数据保存在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

然后就能查看到了

目录

优点:

适用场景:

代码示例:

效果查看:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值