是否可以将SharedPreferences文件保存到自定义目录中?让我们说到/data/data/package.name/my_prefs/
。
或者是否可以检索目录SharedPreferences默认保存到?
P.S。硬编码路径/data/data/package.name/shared_prefs/
不是解决方案。
答案 0 :(得分:6)
或者是否可以检索SharedPreferences所在的目录 默认保存为?
是
这基本上是你可以从 ApplicationInfo 对象获得的dataDir / shared_prefs(反过来你可以从 PackageManager 获得)。 (另外,它可能与“getFilesDir”目录相同,你可以从 Context 本身轻松获得?不确定,没有检查。)
从源代码开始,以 Context.getSharedPreferences (ContextImpl source)开头:
public SharedPreferences getSharedPreferences(String name, int mode) {
SharedPreferencesImpl sp;
File prefsFile;
boolean needInitialLoad = false;
synchronized (sSharedPrefs) {
sp = sSharedPrefs.get(name);
if (sp != null && !sp.hasFileChangedUnexpectedly()) {
return sp;
}
prefsFile = getSharedPrefsFile(name);
...
public File getSharedPrefsFile(String name) {
return makeFilename(getPreferencesDir(), name + ".xml");
}
private File getPreferencesDir() {
synchronized (mSync) {
if (mPreferencesDir == null) {
mPreferencesDir = new File(getDataDirFile(), "shared_prefs");
}
return mPreferencesDir;
}
}
private File getDataDirFile() {
if (mPackageInfo != null) {
return mPackageInfo.getDataDirFile();
}
throw new RuntimeException("Not supported in system context");
}
“mPackageInfo”是 LoadedApk 的一个实例:
public File getDataDirFile() {
return mDataDirFile;
}
mDataDirFile = mDataDir != null ? new File(mDataDir) : null;
mDataDir = aInfo.dataDir;
这将我们带回 ApplicationInfo 。
我想说如果你不想依赖惯例 / data / data /< package_name> / shared_prefs 那么获取“dataDir”并依赖它应该是安全的那里的“shared_prefs”?
答案 1 :(得分:0)
或者是否可以检索SharedPreferences所在的目录 默认保存为?
请参阅此答案,了解如何以安全的方式获取路径:https://stackoverflow.com/a/33849650/1504248