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 中:
java 代码示例
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。
kotlin 代码示例,view model 中:
val pref: SharedPreferences = getApplication<Application>().getSharedPreferences("ble", Context.MODE_PRIVATE)
val editor = pref.edit()
editor.putString("mac", mac)
editor.apply()
查看真机数据
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 聊聊, 查看更多联系方式