Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从服务读取时首选项不是最新的_Android - Fatal编程技术网

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);