Ste*_*eel 4 android sharedpreferences
我有一个PreferenceFragment,我在XML中定义了一个CheckBoxPreference.我需要在服务中检查这个值,但它总是给我旧值.我注意到当我重新启动应用程序时,该值已正确更改.
我的偏好片段:
public class OptionsFragment extends PreferenceFragment
{
public static final String WIFI_ONLY = "wifi";
private SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getInstance());
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.config);
}
}
Run Code Online (Sandbox Code Playgroud)
我的config.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<CheckBoxPreference
android:defaultValue="true"
android:key="wifi"
android:summary="Check if you want to use wifi only"
android:title="Use Wifi only" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
我的服务:
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MyApplication.getInstance());
Log.d(TAG, "isWifiOnly : "+settings.getBoolean(OptionsFragment.WIFI_ONLY, true));
Run Code Online (Sandbox Code Playgroud)
无论是否更改,日志始终返回相同的值,除非我重新启动应用程序.另外,在我的MainActivity中,我在OnCreate()中有这一行:
PreferenceManager.setDefaultValues(getApplicationContext(), R.xml.config, false);
Run Code Online (Sandbox Code Playgroud)
如果需要,它会使用默认值创建配置文件.
我做错了什么,问题是什么?
我找到了一个解决方案,感谢这个链接在同一个应用程序中管理PreferenceActivity和Service中的SharedPreferences,感谢Andrew T.:
问题是多进程模式.如果你有一个使用android:process =""(这是我的情况)在清单中声明的服务,那么有必要设置一个多进程模式.
这是我做的:
在PreferenceFragment中:
public static final String CONFIG_NAME = "pref";
...
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesName(CONFIG_NAME);
getPreferenceManager().setSharedPreferencesMode(Context.MODE_MULTI_PROCESS);
addPreferencesFromResource(R.xml.config);
...
}
Run Code Online (Sandbox Code Playgroud)
我的服务:
SharedPreferences settings = MyApplication.getInstance().getSharedPreferences(OptionsFragment.CONFIG_NAME, Context.MODE_MULTI_PROCESS);
Run Code Online (Sandbox Code Playgroud)
我以这种方式在MainActivity中设置默认值:
PreferenceManager.setDefaultValues(getApplicationContext(), OptionsFragment.CONFIG_NAME, Context.MODE_MULTI_PROCESS, R.xml.config, false);
Run Code Online (Sandbox Code Playgroud)
现在它工作正常.希望它会有所帮助!
再次感谢Andrew T.
| 归档时间: |
|
| 查看次数: |
3907 次 |
| 最近记录: |