我目前有一项服务在启动时加载首选项,将它们存储为字段,然后注册OnSharedPreferenceChangeListener
以在修改首选项时更新字段。目前,我的代码如下所示:
public class MyService extends Service {
private int _prefA;
private boolean _prefB;
private String _prefC;
private boolean _prefD;
private SharedPreferences _preferences;
private SharedPreferences.OnSharedPreferenceChangeListener _prefChangeListener;
@Override
public void onCreate() {
super.onCreate();
_preferences = PreferenceManager.getDefaultSharedPreferences(this);
_prefA = Integer.parseInt(_preferences.getString(PREF_A_KEY, "0"));
_prefB = _preferences.getBoolean(PREF_B_KEY, false);
_prefC = _preferences.getString(PREF_C_KEY, null);
_prefD = _preferences.getBoolean(PREF_D_KEY, false);
_prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(PREF_A_KEY)) {
_prefA = Integer.parseInt(sharedPreferences.getString(key, "0"));
} else if (key.equals(PREF_B_KEY)) {
_prefB = sharedPreferences.getBoolean(key, false);
} else if (key.equals(PREF_C_KEY)) {
_prefC = sharedPreferences.getString(key, null);
} else if (key.equals(PREF_D_KEY)) {
_prefD = sharedPreferences.getBoolean(key, false);
}
}
};
_preferences.registerOnSharedPreferenceChangeListener(_prefChangeListener);
}
}
它按预期工作,但添加更多首选项变得乏味,因为我必须更新onCreate()
和OnSharedPreferenceChangeListener
中的代码。有没有办法改变这个,以便加载首选项的代码只需要写一次?
答案 0 :(得分:0)
这是相当理想的。但是,它减少了一点开销:
创建初始化函数:
private void initializeAccounts() {
...
Resources res = getResources();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String User = preferences.getString(res.getString(R.string.username), null);
String Pass = preferences.getString(res.getString(R.string.password), null);
...
}
然后对首选项进行分组:
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (getString(R.string.prefkey_password).equals(key) || getString(R.string.prefkey_username).equals(key)) {
initializeAccounts();
}
}
在onCreate
:
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
initializeAccounts();
}
我将首选项组合在一起的原因是,当我编辑其中一个首选项时,其他首选项不会发生变化。但是,当我想要更改我的帐户密码时,我还需要其他首选项(如用户名或服务器URI)重新连接到服务器。所以,如果我重置它们或多或少并不重要。
希望这有帮助。