前言
SharedPreferences 是安卓永久保存数据的方式之一,数据不会随着 Activity 的销毁、程序的退出而丢失。SharedPreferences 储存数据的方式为 key - value 形式,可以保存简单的数据。
例子
如下是一个封装好的储存 int 类型数据的类。
package com.example.sharedpreference;
import android.content.Context;
import android.content.SharedPreferences;
public class MyData {
private Context context;
public MyData(Context context){
this.context = context;
}
public void save(String key, int value){
SharedPreferences shp = context.getSharedPreferences(
context.getString(R.string.shared_file_name), Context.MODE_PRIVATE);//此处的文件名为"MyData"
SharedPreferences.Editor editor = shp.edit();
editor.putInt(key, value);
editor.apply();//不要忘记提交
}
public int load(String key){
SharedPreferences shp = context.getSharedPreferences("MyData", Context.MODE_PRIVATE);
return shp.getInt(key, 0);//key, defaultValue;
}
}
提交有两种方式:commit() 与 apply() 。
两者区别在于 apply() 是以非同步的方式提交,可以避免阻塞主线程。
getSharedPreferences() 创建的是全局共享的资源(getPreferences() 已弃用)。可能涉及到多个地方对文件操作,所以推荐使用 apply() 提交。
需要注意的是:Activity 中使用 MyData 类的时候并不能向构造器中直接传入this,Activity 是频繁创建销毁的,若传入 this 作 context,当 Activity 被销毁时,由于 MyData 对象对 Activity 的引用,被销毁的 Activity 对象并不会被 GC 系统回收,从而造成内存泄漏。
传入的参数一般使用 getApplicationContext(),这个 Context 对象的生命周期伴随着整个 app 的运行。
如下是 MainActivity 中使用 MyData 储存数据的例子:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyData myData = new MyData(getApplicationContext());
myData.save("Key1", 100);
myData.save("Key2", 200);
}
}
可在Device File Explorer 中找到存储数据的 MyData.xml 文件。