改变倾听者的偏好

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中进行共享首选项更改时,不会触发任何内容.在清单中,我定义了在不同进程中运行的服务.有没有办法让这项工作?

jjN*_*ord 9

在获得Android的一些经验之后,我回过头来回答这个问题并帮助其他任何遇到此类情况的人.

OnSharedPreferenceChangeListener的实现是正确的.问题在于清单和应用程序架构.由于服务在不同的进程中运行,Android为每个服务创建了不同的Dalvik虚拟机,因此他们不会"听到"彼此的听众.

这只是糟糕的设计 - 接近运行两个并发服务的想法的更好方法是创建一个服务,将每个"服务"线程化并同时运行.通过这种方式,他们可以共享相同的堆,从而共享相同的对象和监听器

如果有人决定使用两个服务,他们可以创建一个BroadcastReceiver来捕获意图,因为需要更改这些首选项 - 或者通过套接字进行通信.还有一些方法可以使用ContentProvider(请永远不要这样做).但同样,如果设计良好,没有任何理由.