Android 从服务读取时首选项不是最新的
我的应用程序中有一个非常简单的首选项实现。这是我的首选项活动:Android 从服务读取时首选项不是最新的,android,Android,我的应用程序中有一个非常简单的首选项实现。这是我的首选项活动: public class Preferences extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.prefere
public class Preferences extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
每个读取首选项的活动或服务都会执行以下操作:
preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
现在,其中一个设置是应用程序所连接的服务器。这是一个未绑定的服务,因为即使用户离开应用程序,它也应该保持在线。当服务启动时(onStartCommand),将从首选项中读取套接字信息
问题是:在更改首选项并重新启动服务后,它仍然具有旧值
我不明白!请帮忙:)
这里有更多的细节,因为它仍然不起作用。我猜我的错误在别的地方 我的服务如下
public class XMPPService2 extends Service {
SharedPreferences preferences;
public void onCreate() { ... }
public int onStartCommand(Intent intent, int flags, int startId) {
preferences = getSharedPreferences("com.company.appname_preferences.xml", MODE_MULTI_PROCESS);
Log.d(TAG, preferences.getString("server", "DEFAULT")); // this always prints the default value
}
public void onDestroy() { ... }
}
据我所知,我没有更多的事情要做。我也试着
getPreferenceManager().setSharedPreferencesMode(MODE_MULTI_PROCESS);
以前
addPreferencesFromResource(R.xml.preferences);
但这没用
现在,我知道这些方法已经被弃用了。但是,我必须确保该应用程序在平板电脑和2.3设备上运行
我只是想说我对安卓还是个新手,也许我误解了一些基本概念。我得到的答案与我的网络研究一致,因此我希望它们是正确的。如果您试图从不同的进程访问共享首选项(即使它们在同一个包中),您需要使用MODE\u MULTIPROCESS 请使用以下代码:
SharedPreferences pref = getSharedPreferences("com.mypackage.myapp_preferences", MODE_MULTI_PROCESS);
重要的是使用MODE\u MULTI\u进程和首选项文件的名称。这可能是因为方法
addPreferencesFromResource()
在API 11中被折旧了:
阅读更多
更有可能的是,偏好如何落实存在问题。您可以发布您的XML吗?您必须从同一个包中读取您的首选项。将您的服务移动到与首选项活动相同的包中,您就完成了。要在进程之间共享首选项,您需要在首选项文件中设置*MODE\u MULTI\u PROCESS*。问题是您无法控制默认首选项文件的标志,对吗? 嗯,有个办法。在PreferenceActivity类中,将以下行添加到onCreate(): 然后,不要使用PreferenceManager.GetDefaultSharedReferences,而是使用以下命令从文件中获取首选项:
getSharedPreferences("preferences", MODE_MULTI_PROCESS);
这似乎是安卓系统的一个缺陷:谢谢你的回答,但它似乎不是那样工作的,或者我做错了什么。在我的onstart命令中,我这样做:preferences=getSharedReferences(“preferences.xml”,MODE\u MULTI\u PROCESS);(我也尝试过R.xml.preferences和其他方法)我会继续尝试并将结果发布到这里首选项文件应该是“com.yourpackage.package_preferences.xml”。例如,如果您的包是“com.myorg.mypackage”,那么您需要使用getSharedReferences(“com.myorg.mypackage\u preferences.xml”,MODE\u MULTI\u PROCESS)。试着让我知道哦。我没有看到下划线,但还是没有运气。我将在下面发布更多细节。不幸的是,我不得不使用不推荐的方法,因为我们必须支持2.3设备以及4.x。我的首选项类扩展了PreferenceActivity。XML看起来和往常一样,只要没有进程试图访问它,它就可以正常工作。
getSharedPreferences("preferences", MODE_MULTI_PROCESS);