文章目录
  1. 1. SharedPreferces
  2. 2. Editor
  3. 3. SharedPreferenChangeListener
  4. 4. 性能
  5. 5. 存放位置
  6. 6. 示例

SharedPreferce作为Android提供的一种保存数据的解决方案,用于保存键值对形式的数据。一本用于存放应用设置,用户数据等。

常用的类包括

  • SharedPreferces 获取建立存储数据
  • SharedPreferces.Editor 对数据编辑的接口
  • SharedPreferces.OnSharedPreferenChangeListener 数据变化的监听器

SharedPreferces

主要用于创建SharedPreferences对象,通过SharedPreference获取数据。常用API有:

1
2
3
4
5
6
7
// 根据名字创建
SharedPreferences preferences = context.getSharedPreferences("shared_name",Context.Mode_PRIVATE);
// 获取变量
preferences.getBoolean("key",defaultValue);
prrferences.get...("key",defaultValue);
// 获取整个键值Map
Map<String,?> all = preferences.getAll();

Editor

SharedPreferences.Editor是用于修改SharedPreferences对象的接口,且Editor做出的修改默认是待处理的,需要使用commit()或者apply()提交修改。

commit()会更快一点
常用的Api有:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 获取Editor对象
SharedPreferences.Editor editor = preferences.edit();
// 添加数据
editor.putBoolean("key",value);
editor.put...("key",value);
// 删除数据
editor.remove("key");
// 清空数据
editor.clear();
// 提交数据,返回是否成功
booleanresult = editor.commit();
// 提交数据,与commit相同,但属于异步操作,无返回值
editor.apply();

SharedPreferenChangeListener

用于监听SharedPreferences的数据改变,常用API有

1
2
3
4
5
6
7
8
9
10
11
// 注册监听器
preferences.registerOnSharedPreferenceChangeListener(mListener);
// 注销监听器
preferences.unregisterOnSharedPreferenceChangeListener(mListener);
// 监听器
SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferces sharedPreferences,String key){
// 实现监听
}
};

性能

  • ShredPreferences是单例对象,第一次打开后,之后获取都无需创建,速度很快。
  • 当第一次获取数据后,数据会被加载到一个缓存的Map中,之后的读取都会非常快。
  • 当由于是XML<->Map的存储方式,所以,数据越大,操作越慢,get、commit、apply、remove、clear都会受影响,所以尽量把数据按功能拆分成若干份。
  • App更新后,Preferences不会被移除,在默写情况下,需要创建迁移数据的方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MigrationManager {
private final static String KEY_PREDERENCES_VERSION = "key_preferences_version";
private final static int PREFERENCES_VERSION = 2;

public static void migrate(Context context) {
SharedPreferences preferences = context.getSharedPreferences("pref",Context.MODE_PRIVATE);
checkPreferences(preferences);
}
// 根据当前App的Preferences版本号,判断是否更新SharedPreferences
private static void checkPreferences(SharedPreferences thePreferences) {
final int oldVersion = thePreferences.getInt(KEY_PREFERENCES_VERSION,1);
if(oldVersion < PREFERENCES_VERSION) {
final SharedPreferences.Editor edit = thePreferences.edit();
edit.clear();
edit.putInt(KEY_PREFERENCES_VERSION, currentVersion);
edit.commit();
}
}
}

存放位置

  • /data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml
  • /data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME_preferences.xml

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class PreferencesManager {

private static final String PREF_NAME = "com.example.app.PREF_NAME";
private static final String KEY_VALUE = "com.example.app.KEY_VALUE";

private static PreferencesManager sInstance;
private final SharedPreferences mPref;

private PreferencesManager(Context context) {
mPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}

public static synchronized void initializeInstance(Context context) {
if (sInstance == null) {
sInstance = new PreferencesManager(context);
}
}

public static synchronized PreferencesManager getInstance() {
if (sInstance == null) {
throw new IllegalStateException(PreferencesManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return sInstance;
}

public void setValue(long value) {
mPref.edit()
.putLong(KEY_VALUE, value)
.commit();
}

public long getValue() {
return mPref.getLong(KEY_VALUE, 0);
}

public void remove(String key) {
mPref.edit()
.remove(key)
.commit();
}

public boolean clear() {
return mPref.edit()
.clear()
.commit();
}
}
文章目录
  1. 1. SharedPreferces
  2. 2. Editor
  3. 3. SharedPreferenChangeListener
  4. 4. 性能
  5. 5. 存放位置
  6. 6. 示例