我看过这篇有用的帖子:
SharedPreferences.onSharedPreferenceChangeListener not being called consistently
但是我没有运气。我正在尝试创建一个在服务中运行的OnSharedPreferenceChangeListener。一切都正确实现,但听众并不总是被触发。
public MyServiceOne extends Service {
public SharedPreferences mSharedPreferences;
// Listener defined by anonymous inner class.
public OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d("debug", "A preference has been changed");
}
};
@Override
public void onCreate() {
mSharedPreferences = getSharedPreferences(MySharedPreferences.NAME, Context.MODE_PRIVATE);
mSharedPreferences.registerOnSharedPreferenceChangeListener(mListener);
}
@Override
public void onDestroy() {
super.onDestroy();
mSharedPreferences.unregisterOnSharedPreferenceChangeListener(mListener);
}
}
更新
问题源于我没有提及的事实。我正在运行两个服务,当在MyService2中进行共享首选项更改时,不会触发任何内容。在清单中,我定义了在不同进程中运行的服务。有没有办法使这项工作?
答案 0 :(得分:8)
在获得Android的一些经验后,我回过头来回答这个问题并帮助其他遇到此类情况遇到问题的人。
OnSharedPreferenceChangeListener的实现是正确的。问题在于清单和应用程序架构。由于服务在不同的进程中运行,Android为每项服务创建了不同的Dalvik虚拟机,因此他们不会“听到”彼此的听众。
这只是糟糕的设计 - 接近运行两个并发服务的想法的更好方法是创建一个服务,将每个“服务”线程化并同时运行。通过这种方式,他们可以共享相同的堆,从而共享相同的对象和放大器。听众
如果有人决定使用两个服务,他们可以创建一个BroadcastReceiver来捕获意图,因为需要更改这些首选项 - 或者通过套接字进行通信。还有一些方法可以使用ContentProvider(请永远不要这样做)。但同样,如果设计良好,没有任何理由。
答案 1 :(得分:0)
为什么不让您的服务实施OnSharedPreferenceChangeListener
?
这样,它不是一个匿名的内部类,所以它不会被垃圾收集,你仍然可以在服务中做任何你想做的事。
答案 2 :(得分:0)
我知道这个帖子已经过时了。但有没有人尝试使用MODE_MULTI_PROCESS?