2

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

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 还是新手,也许我误解了一些基本概念。我得到的答案与我的网络研究一致,所以我希望它们是正确的。

4

5 回答 5

1

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

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

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

getSharedPreferences("preferences", MODE_MULTI_PROCESS);
于 2013-09-15T19:45:13.867 回答
1

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

请使用以下代码:

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

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

于 2012-11-09T15:50:42.220 回答
0

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

于 2013-05-06T15:52:15.630 回答
0

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

于 2014-03-12T18:16:19.620 回答
0

这可能是因为该方法addPreferencesFromResource()在 API 11 中已被贬值:

在这里阅读更多

更有可能是如何提交首选项存在问题。你能发布你的XML吗?

于 2012-11-09T15:53:28.903 回答