在某个地方通过context获取sharedpreferences对象,并进行存储数据后,
在Activity中获取的sharedpreferences存储数据和在Service中获取的sharedpreferences存储数据不一致!
分析:
在getSharedPreferences的时候mode使用的是MODE_PRIVATE,这种mode不支持Activity跟Service之间的数据同步,
把mode改成MODE_MULTI_PROCESS,直接可以解决Activity修改SP数据,Service可以直接同步。
获取SharedPreferences的两种方式:
Context 中 getSharedPreferences方法:
public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
public abstract SharedPreferences getSharedPreferences(File file, @PreferencesMode int mode);
Activity对象的getPreferences()方法
public SharedPreferences getPreferences(@Context.PreferencesMode int mode) {
return getSharedPreferences(getLocalClassName(), mode);
}
两种方式的区别:
调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.
PreferencesMode定义(Android 9.0):
@IntDef(flag = true, prefix = { "MODE_" }, value = {
MODE_PRIVATE,
MODE_WORLD_READABLE,
MODE_WORLD_WRITEABLE,
MODE_MULTI_PROCESS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface PreferencesMode {}
这四种模式代表的含义为:
MODE_PRIVATE: 默认模式,私有方式存储,创建的文件只能由调用应用程序(或共享相同用户ID的所有应用程序)访问
MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取
MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入
MODE_APPEND: 追加方式存储,高版本丢弃此模式
MODE_MULTI_PROCESS: 适用于多进程访问(适用于API <= 2.3 ,目前已被废弃,google官方推荐使用ContentProvider来实现进程间共享访问)