这是我的用例。
PreferenceActivity
提供可选择的主题列表。当用户从列表中选择特定主题时,我希望立即进行效果。
截至目前,主题更改会影响所有已启动的新活动,但不会影响当前可见的PreferenceActivity
和后台堆栈上的活动。
为了解决这个问题,我决定实现一个Sharedpreference
更改侦听器,在更改时将清除backstack
中的所有旧活动,并使用修改后的主题重新启动相同的类。
这是我尝试过的。
SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
Intent newIntent = new Intent(Settings.this,Settings.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
}
};
我尝试过简单的日志消息,例如Log.e("change", "pref changed");
但看起来,这个听众根本就没有听取变化。
答案 0 :(得分:2)
将其注册为SharedPreferences.registerOnSharedPreferenceChangeListener
。
另外,请记住,监听器保存在WeakHashMap
中。这意味着您不能将匿名内部类用作侦听器,因为一旦离开当前作用域,它将成为垃圾收集的目标。因此,使您的侦听器成为您的活动的实例变量,或使活动本身实现侦听器。