gpt4 book ai didi

android - 更改监听器的偏好

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:20 25 4
gpt4 key购买 nike

我已经阅读了这篇有用的帖子:

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 中进行共享首选项更改时,不会触发任何内容。在 list 中,我定义了在不同进程中运行的服务。有什么办法可以做到这一点吗?

最佳答案

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

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

这只是糟糕的设计 - 实现运行两个并发服务的想法的更好方法是创建一个服务,将每个“服务”线程关闭以同时运行。这样他们就可以共享相同的堆,从而共享相同的对象和监听器

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

关于android - 更改监听器的偏好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com