关于SharedPreference踩的那些坑
SharedPreferences多进程 为什么会突然写这篇文章呢,主要是我昨天在用SharedPreferences的时候,涉及到多进程访问,写的时候没注意,然后导致数据不对,既然踩了坑,肯定要自己反思一下总结,所以也就有了这篇文章,简单总结一下, 首先直截了当得先回答文章开头那个问题,答案是:能但是不行。 为什么这么说呢,因为SharedPreferences确实可以通过设置MODE_MULTI_PROCESS实现多进程访问,而且是SDK2.3 之前是默认的,连这个标志都不用设置,SDK2.3之后就需要手动设置,既然这么说了,那就肯定是能了,但是为什么说不行呢?因为这个标志在 SDK6.0 的时候已经被Deprecated,Android为什么要把这么一个简单易用的进程间通讯方式废弃掉呢,看下源码就可以知道,原因就是它并不能保证数据的安全性和准确性,并没有实现并发修改的机制,所以官方也就不推荐了,而是推荐使用 ContentProvider。总结一句话:爱过。 基础知识大普及 既然看到了源码,索性就看完整一点,这样以后用的时候也更顺手一点,于是简单的把SharedPreferences相关的内容简单都看了下,下面就是自己简单的一些笔记: 我平时在使用 SharedPreferences 一般会直接用: SharedPreferences sp2 = PreferenceManager.getDefaultSharedPreferences(this); 来获得一个SharedPreferences的引用来操作,正好借着这个机会好好看了下官方的介绍,终于算是对SharedPreferences有一个更完善的认识了, SharedPreferences sp1 = getSharedPreferences(getPackageName() + "test", MODE_PRIVATE); SharedPreferences sp2 = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences sp3 = getPreferences(MODE_PRIVATE); 上面的三行代码都是为了获得一个SharedPreferences 引用,其中第三个方法是Activity专有的,其实我们看源码的话,就会发现其实后两个方法其实都是第一个方法的封装 public static SharedPreferences getDefaultSharedPreferences(Context context) { return context.getSharedPreferences(getDefaultSharedPreferencesName(context), getDefaultSharedPreferencesMode()); } private static String getDefaultSharedPreferencesName(Context context) { return context.getPackageName() + "_preferences"; } private static int getDefaultSharedPreferencesMode() { return Context.MODE_PRIVATE; } 正如你所见,getDefaultSharedPreferences()就是返回了一个名字为getPackageName() + "_preferences",mode 为MODE_PRIVATE的实例。 public SharedPreferences getPreferences(int mode) { return getSharedPreferences(getLocalClassName(), mode); } 而getPreferences就是返回了一个名字是以当前类名命名的,mode自定义的实例。...