繁体   English   中英

从服务中读取时首选项不是最新的

[英]Preferences not up-to-date when read from service

我的应用程序中有一个非常简单的首选项实现。 这是我的首选项活动:

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 设备上运行。

我只是想提一下,我对 android 还是个新手,也许我误解了一些基本概念。 我得到的答案与我的网络研究一致,所以我希望它们是正确的。

如果您尝试从不同的进程访问共享首选项(即使它们在同一个包中),您需要使用 MODE_MULTIPROCESS。

请使用以下代码:

 SharedPreferences pref = getSharedPreferences("com.mypackage.myapp_preferences", MODE_MULTI_PROCESS);

重要的是使用 MODE_MULTI_PROCESS 和您的首选项文件的名称。

要在进程之间共享首选项,您需要在首选项文件上设置 *MODE_MULTI_PROCESS*。 问题是您无法控制默认首选项文件的标志,对吗? 嗯,有办法。 在您的PreferenceActivity类中,将这些行添加到onCreate()

PreferenceManager prefMgr = getPreferenceManager();
prefMgr.setSharedPreferencesName("preferences");
prefMgr.setSharedPreferencesMode(MODE_MULTI_PROCESS);

然后,而不是使用PreferenceManager.getDefaultSharedPreferences ,使用以下方法从文件中获取首选项:

getSharedPreferences("preferences", MODE_MULTI_PROCESS);

这可能是因为方法addPreferencesFromResource()在 API 11 中被贬低了:

在这里阅读更多

更有可能的是,偏好的提交方式存在问题。 你能发布你的XML吗?

您必须从同一个包中读取您的首选项。 将您的服务移动到与偏好活动相同的包中,您就完成了。

这似乎是 android 中的一个错误: https : //code.google.com/p/android/issues/detail? id =66625

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM