android - 将 SharedPreferences 文件保存到自定义目录或获取默认 SharedPreferences 目录

标签 android sharedpreferences

是否可以将 SharedPreferences 文件保存到自定义目录中?让我们说到 /data/data/package.name/my_prefs/

或者是否可以检索默认保存 SharedPreferences 的目录?

附言硬编码路径 /data/data/package.name/shared_prefs/ 不是解决方案。

最佳答案

Or is it possible to retrieve the directory SharedPreferences are saved by default to?

是的。

这基本上是 dataDir/shared_prefs,您可以从 ApplicationInfo 对象(反过来您可以从 PackageManager 获得)。 (此外,它可能与您可以从 Context 本身轻松获取的“getFilesDir”目录相同?不确定,没有检查。)

从源代码开始,从 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//shared_prefs 那么获取“dataDir”并依赖“shared_prefs”从那里?

关于android - 将 SharedPreferences 文件保存到自定义目录或获取默认 SharedPreferences 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8194883/

相关文章:

java - 免费源代码存储库?

android - WebView - 是否可以设置自定义监听器来处理网页转发操作?

java - MVVM 在远程类中共享首选项

android - SharedPreferences在android程序中产生强制关闭

java - Android HashSet 无法转换为 LinkedHashSet

Android:不会一次列出所有项目

android - 如何接收 Intent。 ACTION_PACKAGE_ADDED Intent 。应用小部件中的 ACTION_PACKAGE_REMOVED?

android - WebView - 在外部浏览器中加载链接

java - session 管理遇到问题

android - 更改升级时的默认首选项