jjN*_*ord 8 service android onchange listener preference
我看过这篇有用的帖子:
SharedPreferences.onSharedPreferenceChangeListener未被一致地调用
但是我没有运气.我正在尝试创建一个在服务中运行的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);
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
问题源于我没有提及的事实.我正在运行两个服务,当在MyService2中进行共享首选项更改时,不会触发任何内容.在清单中,我定义了在不同进程中运行的服务.有没有办法让这项工作?
在获得Android的一些经验之后,我回过头来回答这个问题并帮助其他任何遇到此类情况的人.
OnSharedPreferenceChangeListener的实现是正确的.问题在于清单和应用程序架构.由于服务在不同的进程中运行,Android为每个服务创建了不同的Dalvik虚拟机,因此他们不会"听到"彼此的听众.
这只是糟糕的设计 - 接近运行两个并发服务的想法的更好方法是创建一个服务,将每个"服务"线程化并同时运行.通过这种方式,他们可以共享相同的堆,从而共享相同的对象和监听器
如果有人决定使用两个服务,他们可以创建一个BroadcastReceiver来捕获意图,因为需要更改这些首选项 - 或者通过套接字进行通信.还有一些方法可以使用ContentProvider(请永远不要这样做).但同样,如果设计良好,没有任何理由.
归档时间: |
|
查看次数: |
10103 次 |
最近记录: |