安卓SharedPreferences备份无法正常工作

7
我一直在研究如何备份SharedPreferences在我的Android应用程序中,特别是使用反射来保持向后兼容性。至少我一直在尝试。不幸的是,我的代码实际上并没有创建备份!这包括强制在模拟器上执行adb bmgr命令,如此这里所述。因此,我想知道社区是否可以帮助我,并在此过程中提供一些更好的文档?
以下是我的代码。为了使其尽可能通用,我将简单地将我的应用程序称为Andy,包名为com.example.andyAndroid清单(摘录)
<application
    ...
    android:backupAgent="com.example.andy.backupHelper"
    android:restoreAnyVersion="true">
    ...
    <meta-data
        android:name="com.google.android.backup.api_key"
        android:value="GIVEN KEY GOES HERE" />
    ...

backupHelper.java

注意:/data/data/com.example.andy/shared_prefs/com.example.andy_preferences.xml
package com.example.andy;

import android.app.backup.BackupAgentHelper;
import android.app.backup.SharedPreferencesBackupHelper;

public class BlinkyBackup extends BackupAgentHelper {

    static final String PREFS_FILE = "andy_preferences";
    static final String BACKUP_KEY = "AndyPreferencesBackup";

    public void onCreate() {

        SharedPreferencesBackupHelper backupHelper = new SharedPreferencesBackupHelper(this, PREFS_FILE);
        addHelper(BACKUP_KEY, backupHelper);
    }
}

备份代理包装器

package com.example.andy;

import android.app.backup.BackupManager;
import android.content.Context;

public class BackupAgentWrapper {

    private BackupManager wrappedInstance;

    static {

        try {

            Class.forName("android.app.backup.BackupManager");
        }
        catch (Exception e) {

            throw new RuntimeException(e);
        }
    }

    public static void checkAvailable() {}

    public void dataChanged() {

        wrappedInstance.dataChanged();
    }

    public BackupAgentWrapper(Context ctx) {

        wrappedInstance = new BackupManager(ctx);
    }
}

最后,是在运行时启动备份的命令。在我的应用程序中,这段代码是从一个可用于应用程序的类(而不是主活动)运行的,该类在创建时将 this 作为上下文传递,并存储在私有变量mContext中。
private void backupData() {

    boolean backupAgentAvailable = false;

    try {

        BackupAgentWrapper.checkAvailable();
        backupAgentAvailable = true;
    }
    catch (Throwable t) {

        // really nothing to do
    }

    if(backupAgentAvailable) {

        BackupAgentWrapper backupWrapper = new BackupAgentWrapper(mContext);
        backupWrapper.dataChanged();
    }
}

总结一下,以上函数和以下命令都不会备份任何数据:
$ adb shell bmgr enable true
$ adb shell bmgr backup com.example.andy
$ adb shell bmgr run
1个回答

5

在您的主调用活动(应用程序中开始的第一个活动)中,您需要实例化BackupManager

BackupManager mBackupManager = new BackupManager(getApplicationContext());

这将告诉备份管理器寻找备份文件并加载它。

您需要确保偏好设置文件格式为"packagename_preferences",例如:andy_preferences。并且在第一次保存您的偏好设置时使用相同的名称。(非常重要!)

在您的设置活动通过apply()commit()保存后,您需要告诉BackupManager有些内容已经更改,所以立即包含以下内容:

mBackupManger.dataChanged();

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