注册代码以下:ide
1 SharedPreferences sp = getSharedPreferences("AndroidDemo", Context.MODE_PRIVATE); 2 sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { 3 @Override 4 public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) { 5 } 6 });
没法回调主要是由于注册的监听器使用了匿名内部类,因为SharedPreferences保持在WeakHashMap中,这意味着你不能监听一个匿名内部类,由于它会成为垃圾收集的目标,只要你离开目前的范围,它将会被垃圾收集,从WeakHashMap中删除并中止工做。spa
应该使用当前类做为监听器,即在当前类中实现SharedPreferences.OnSharedPreferenceChangeListener接口,只要当前类的实例没有被回收,就能够保证回调的有效性。code
因此注册此监听时,最好不要使用匿名内部类,不然会因为垃圾回收机制致使此监听无效,而没法回调。blog