改变倾听者的偏好

时间:2011-11-01 14:34:11

标签: android service listener onchange preference

我看过这篇有用的帖子:

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:0)

为什么不让您的服务实施OnSharedPreferenceChangeListener

这样,它不是一个匿名的内部类,所以它不会被垃圾收集,你仍然可以在服务中做任何你想做的事。

答案 2 :(得分:0)

我知道这个帖子已经过时了。但有没有人尝试使用MODE_MULTI_PROCESS?

MODE_MULTI_PROCESS