在Android 4.3上测试过。我有两个应用com.my.app.first
和com.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的调用也会返回当前应用的首选项。我究竟做错了什么?请帮忙!
答案 0 :(得分:2)
getSharedPreferences
API中的错误。事实证明,之前对getSharedPreferences
的调用导致另一个context.getSharedPreferences()
调用返回上一个实例 - 当前应用的首选项。
解决方案是确保在阅读其他应用的偏好设置之前调用getSharedPreferences()
NOT 。
答案 1 :(得分:2)
通过再次阅读旧的上下文来解决。对我来说听起来像是一个缓存。
Context tempContext = context.createPackageContext(originalContext.getPackageName(),Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedInformationM2 = tempContext.getSharedPreferences("sharedInformation", Context.MODE_WORLD_READABLE);
答案 2 :(得分:1)
您可能希望在App A MODE_WORLD_READABLE中创建SharedPreference,并为App A和App B使用通用的sharedUserId。如链接中所述,
http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html
答案 3 :(得分:0)
由于您的两个应用程序都在运行,您还可以通过设置共享首选项来解决此问题:
tempContext.getSharedPreferences("sharedInformation", Context.MODE_MULTI_PROCESS);