7

我一直在做我的作业,关于如何在我的Android应用程序中备份SharedPreferences,特别是使用反射来维持向后兼容性。至少我一直在努力。不幸的是,我的代码实际上都没有结束创建备份!这包括在模拟器上强制adb bmgr命令,如here所述。所以我想知道社区是否可以帮助我,并在这个过程中提出一些更好的文档?Android SharedPreferences备份不工作

这是我的代码。为了尽量保持其他用户的通用性,我会直接打电话给我的应用程序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); 
    } 
} 

最后,在运行时启动备份的命令。在我的应用程序中,此代码是从可用于我的应用程序的类(不是主要活动)运行的,该代码在创建时作为上下文传递,然后存储在专用变量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 

回答

5

在你的主通话活动(即开始在你的应用程序第一个),您需要实例BackupManager

BackupManager mBackupManager = new BackupManager(getApplicationContext()); 

这将告诉backupmanager查找备份文件并加载它。

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

的设置活动通过apply()commit()保存之后,你需要告诉BackupManager事情有了变化,以便立即将后:

mBackupManger.dataChanged();