我有一个偏好活动,首先当我有机会优先选择onPreferenceChange被触发一次如预期.
但是,在一段时间之后(转到不同的活动等等),onPreferenceChange被调用两次.
我在调试器中看到,对于mListeners的WeakHashMap在开始时为1,然后变为大于1,但不知道为什么?
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPrefs(); int preferencesResource = 0; // R.xml.preferences; preferencesResource = getResources().getIdentifier("pref","xml",getPackageName()); addPreferencesFromResource(preferencesResource); listener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences arg0,String arg1) { // Why is this called once then sometimes twice!! Log.i("PreferencesActivity","OnPreferenceChanged()"); } }; prefs.registerOnSharedPreferenceChangeListener(listener); } protected void onDestroy() { super.onDestroy(); listener = null; prefs.unregisterOnSharedPreferenceChangeListener(listener); prefs = null; } public Preferences getPrefs() { if (prefs == null) prefs = new Preferences(this); return prefs; }
解决方法
您已将unregisterOnSharedPreferenceChangeListener()放在onDestroy()中,并且在所有活动重新启动时未调用它.
看看activity lifecycle diagram.结论是,正确的方法是分别在onResume()和onPause()中放置registerOnSharedPreferenceChangeListener()和unregisterOnSharedPreferenceChangeListener().