Android SharedPreferences 存储 key / value 数据

更新日期: 2023-03-15 阅读次数: 1121 字数: 373 分类: Android

Android App 中想实现保存默认的蓝牙设备 Mac 地址,本质上就是一个 key / value 键值对的存储及读取过程。

可以使用 SharedPreferences 来实现。

SharedPreferences 指向了一个存储键值对的 XML 文件,并提供了读写接口。

共享级别

  • activity 级:getPreferences(), 即单个 activity 内共享的存储
  • app 级:即全局共享。getSharedPreferences(), 但是这个要加上两个参数,第一个是文件名,第二个是模式,用 MODE_PRIVATE 即可(本app内可见)
  • app 级:还有一个是 getDefaultSharedPreferences(),其不需要指定文件名,因为是默认写死的。应该是跟 app 内 settings UI 相关。

异步/同步写入

  • 异步:apply
  • 同步:commit。应避免在 UI 主线程中调用 commit,否则会造成界面刷新的卡顿。

数据何时消失

  • 卸载 app
  • 在系统设置里清空 app 数据
  • 主动调用 editor 的 remove one key 或者 clear 清空所有,然后提交更改

code

fragment 中:

SharedPreferences pref = getActivity().getSharedPreferences(getPackageName() + "_ble", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("key_name1", "string value");
editor.putInt("key_name2", 100);
editor.apply();

pref.getString("key_name1", "default value");

对于 activity 和 service 来说,可以直接调用 getSharedPreferences。因为这两个都是继承自 Context。

查看真机数据

Android Studio 界面右下角有个 Device File Explorer, 点开之后,找到 /data/data/你的APP包名/shared_prefs/指定的文件名.xml

里面存储的就是 key / value 数据。例如:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="default_device">string value</string>
</map>

存储对象的序列化数据

有时需要将 object 直接缓存:

参考 https://stackoverflow.com/questions/7145606/how-do-you-save-store-objects-in-sharedpreferences-on-android

使用 gson 这个库,将对象序列化,然后存储。

参考

  • https://developer.android.com/training/data-storage/shared-preferences
  • https://www.digitalocean.com/community/tutorials/android-shared-preferences-example-tutorial

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式