【问题标题】:Android SharedPreferences Backup Not WorkingAndroid SharedPreferences 备份不起作用
【发布时间】:2011-03-01 23:08:30
【问题描述】:

我一直在研究如何在我的 Android 应用程序中备份 SharedPreferences,尤其是使用反射来保持向后兼容性。至少我一直在努力。不幸的是,我的代码实际上都没有创建备份!这包括在模拟器上强制执行 adb bmgr 命令,如here 所述。所以我想知道社区是否可以帮助我并在此过程中提供一些更好的文档?

这是我的代码。为了使其对其他人尽可能通用,我将简单地调用我的应用程序 Andy 并使用包名 com.example.andy

Android 清单(摘录)

<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);
    }
}

BackupAgentWrapper

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

【问题讨论】:

    标签: android sharedpreferences backup-strategies android-backup-service


    【解决方案1】:

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

    BackupManager mBackupManager = new BackupManager(getApplicationContext());
    

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

    您需要确保首选项文件格式为"packagename_preferences",例如。安迪偏好。并在您首次保存首选项时使用相同的名称。 (非常重要!)

    在您的设置活动通过apply()commit() 保存后,您需要告诉BackupManager 发生了一些变化,因此请在之后立即包含:

    mBackupManger.dataChanged();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2016-10-11
      • 2013-09-05
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多