我有一个后台服务,可以读取cpu使用情况和频率并在通知栏上显示
在应用程序设置(首选项)中,我可以选择仅显示频率加载或两者都
但获取共享首选项的方法不会获得最新的SharedPreference
它只在第一次服务启动时获得SharedPreference,如果我在Preference屏幕中选择了不同的选项,它将不会在服务中更新
这是代码
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Runnable runnable = new Runnable() {@Override
public void run() {
while (thread) {
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
items = sharedPrefs.getString("notif", "freq");
System.out.println(items); //this keeps displaying the same value even if i go to Preference screen and change to something else
if (items.equals("freq") || items.equals("both")) {
}
if (items.equals("load") || items.equals("both")) {
} //reading frequency and load depending on what is selected
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler.post(new Runnable() {@Override
public void run() {
if (thread) {
createNotification(); //create notification
}
}
});
}
}
};
new Thread(runnable).start();
return START_STICKY;
}
答案 0 :(得分:1)
<强>解决强>
因为我的服务是在单独的进程中运行的,所以我必须在访问共享首选项时添加此标志
private final static int PREFERENCES_MODE = Context.MODE_MULTI_PROCESS;
并像这样改变
sharedPrefs = this.getSharedPreferences("preference name", PREFERENCES_MODE);
答案 1 :(得分:0)
确保您正确地将数据写入共享偏好设置,特别是commit()
您的更改,as docs say:
您在编辑器中所做的所有更改都将进行批处理,而不是复制回 原始的SharedPreferences直到你调用commit()或apply()
以下是示例代码:
SharedPreferences.Editor editor = mPrefs.edit();
editor.putBoolean( key, value );
editor.commit();
答案 2 :(得分:0)
我认为错误就行了
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
你从一个线程中传递'this'的地方?你能用应用程序上下文改变它吗?