7

在安卓 4.3 上测试。我有两个应用程序,com.my.app.firstcom.my.app.second. 在我的活动中,我想从其他应用程序中读取首选项。我选择为我的两个应用程序使用相同的用户 ID:

android:sharedUserId="com.my.app"

我总是像这样加载我的偏好:

prefs = getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);

现在,在我的第二个应用程序中,我执行以下操作:

try {
    Context context = createPackageContext("com.my.app.first", Context.CONTEXT_IGNORE_SECURITY);
    // context.getPackageName() does indeed return "com.my.app.first"

    // Note: Context.MODE_WORLD_READABLE makes no difference here!
    prefs = context.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);
}

prefs.mFile错误地指向/data/data/com.my.app.second/shared_prefs/MyAppPreferences.xml.

显然,对getSharedPreferences的调用会返回当前应用程序的首选项,即使我使用了其他应用程序的上下文。我究竟做错了什么?请帮忙!

4

4 回答 4

2

发现问题了!这肯定看起来像getSharedPreferencesAPI 中的错误。事实证明,先前的调用getSharedPreferences导致另一个context.getSharedPreferences()调用返回先前的实例 - 当前应用程序的首选项。

解决方案是确保getSharedPreferences()在读取其他应用程序的首选项之前没有调用它。

于 2013-08-19T17:16:32.867 回答
2

只需再次阅读旧上下文即可解决。对我来说听起来也像一个缓存。

Context tempContext = context.createPackageContext(originalContext.getPackageName(),Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedInformationM2 = tempContext.getSharedPreferences("sharedInformation", Context.MODE_WORLD_READABLE);
于 2014-04-08T19:08:52.910 回答
1

您可能希望在 App A MODE_WORLD_READABLE 中创建 SharedPreference,并为 App A 和 App B 使用公共 sharedUserId。如链接中所述,

http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

于 2013-08-19T12:32:00.033 回答
0

由于您的两个应用程序都在运行,您还可以通过设置共享首选项来解决此问题:

tempContext.getSharedPreferences("sharedInformation", Context.MODE_MULTI_PROCESS);
于 2015-08-25T11:58:23.583 回答