默认情况下,共享偏好使用的文件名是什么?

17

Android备份服务要求备份共享首选项的文件名:

public static final String PREFS = "PrefFile";    
SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS);

如果在首选项创建过程中给出文件名,则清楚应该使用什么

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

但我使用默认的共享偏好:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

我应该将什么作为SharedPreferencesBackupHelperPREFS值传递?

3个回答

25
private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

在 AndroidManifest.xml 文件中查看您的包名


使用硬编码值“_preferences”是否安全?它能在所有Android设备上正常工作吗? - LA_
不能保证,所以我认为最好使用已定义名称的SP。 - Dmitry
1
谢谢。有没有方法可以从共享偏好中获取文件名? - LA_
2
这现在作为API 24中PreferenceManager的公共方法公开:https://developer.android.com/reference/android/preference/PreferenceManager.html#getDefaultSharedPreferencesName(android.content.Context) - Ronald Martin
如果没有公共方法,请使用Reflections - 这是更好的选择,因为构造代码中的某些名称会不断变化(即API)- 因此,对于这种解决方案进行反对票。 LA_和答案的所有者 - ceph3us

6
源代码来看,PackageName是基于您传入的上下文而确定的。
private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

很不幸,getDefaultSharedPreferencesName 方法是私有的。是否有任何公共方法可以获取它? - LA_
你不能只是将这个方法添加到你的代码中,然后就可以这样使用吗? - MrEngineer13
正如我在另一个答案的评论中提到的,我不确定这是否是硬编码的正确方式——如果Google在下一个Android版本中更改了它,会发生什么? - LA_
1
如果您担心这会在下一个版本中更改,为什么不使用自己的密钥与 getSharedPreferences,这样就永远不会有这个问题了。http://developer.android.com/training/basics/data-storage/shared-preferences.html - MrEngineer13

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接