Android-SharedPreference

Android-SharedPreference

Android 中获取 SharedPreferences 的方式有 3 种:

(1)Context 中的 getSharedPreferences(String name, int mode)

name 用于指定 SharedPreference 的文件名,如果不存在则创建。mode 用于指定操作模式,有以下几种选择:

  • Context.MODE_PRIVATE:只能被本应用程序读、写。
  • Context.MODE_WORLD_READABLE:能被其他应用程序读,但不能写(Android 4.2 已弃用)。
  • Context.MODE_WORLD_WRITEABLE:能被其他应用程序读、写(Android 4.2 已弃用)。
  • Context.MODE_APPEND:检查文件是否存在,存在则追加内容,否则创建新文件。

(2)Activity 中的 getPreferences(int mode)
getSharedPreferences() 类似,但自动将当前活动的类名作为 SharedPreferences 的文件名。

(3)PreferenceManager 中的 getDefaultSharedPreferences(Context context)
 这是一个静态方法,自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。


待整理

SP的本质是HashMap,存储的是键值对数据,在本地存储中以xml文件的形式保存。

SP本身是线程安全的,读写都用synchronized锁住了,但由于每次修改都会生成一个EditorImpl对象,因此最好是批量处理,最后统一提交。

提交时有两种方案,commit在UI线程,apply在子线程,使用commit如果耗时太长超过5s,会导致ANR,使用commit,如果提交时关闭Activity,会检查一个工作任务队列sPendingWorkFinishers中的任务是否全部完成,如果有未完成的任务,就会一直等待,所以如果commit太大量的数据导致Activity结束时等待超过5s,一样会导致ANR。

由于读取本地文件的性能开销很大,所以SP读取数据后,会一直保存在内存,因此如果存放了过大的数据,会导致频繁GC甚至OOM。

如果SP数据较多,频繁读取的数据和非频繁读取的数据最好分成不同的SP文件。


参考文献