使用Android自动备份备份应用程序文件

时间:2015-12-01 17:36:05

标签: android realm android-backup-service

我尝试在Android 6及更低版本中使用Android自动备份功能,但在重新安装我的应用后,什么都不会恢复。

清单:

<application
            android:allowBackup="true"
            android:backupAgent=".BackupAgent"
            android:fullBackupOnly="true"
            android:fullBackupContent="true"
            android:name="com.App">

            <meta-data
                android:name="com.google.android.backup.api_key"
                android:value="API_KEY"/>
</application>

BackupAgent:

public class BackupAgent extends BackupAgentHelper {
    @Override
    public void onCreate() {
        super.onCreate();
        BackupHelper helper = new FileBackupHelper(getApplicationContext(), Realm.getDefaultInstance().getPath());

        addHelper("database", helper);
    }
}

使用Realm的片段:

public class NewBlockNumber extends Fragment implements Validator.ValidationListener {
    private Realm mRealm;
    private RealmChangeListener mRealmChangeListener = new RealmChangeListener() {
        @Override
        public void onChange() {
            BackupManager bm = new BackupManager(getContext());
            bm.dataChanged();
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mRealm = Realm.getDefaultInstance();
        mRealm.addChangeListener(mRealmChangeListener);

        return null;
    }
}

1 个答案:

答案 0 :(得分:0)

您必须使用db的文件名而不是路径来实例化FileBackupHelper。然后,BackupAgent将解析绝对路径。您可以调试它并跟踪所有步骤以检查它。 我在我的应用程序中运行此代码,它运行正常。

@Override
public void onCreate() {
    FileBackupHelper hosts = new FileBackupHelper(this, Realm.getDefaultInstance().getConfiguration().getRealmFileName());
    addHelper(Realm.getDefaultInstance().getConfiguration().getRealmFileName(), hosts);
}

@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
                     ParcelFileDescriptor newState) throws IOException {
    Log.w("Backup", "onBackup");
    // Hold the lock while the FileBackupHelper performs backup
    synchronized (MainActivity.sDataLock) {
        Log.w("Backup", "backing up...");
        super.onBackup(oldState, data, newState);
    }
}

@Override
public void onRestore(BackupDataInput data, int appVersionCode,
                      ParcelFileDescriptor newState) throws IOException {
    Log.w("Backup", "onRestore");
    // Hold the lock while the FileBackupHelper restores the file
    synchronized (MainActivity.sDataLock) {
        Log.w("Backup", "Restoring data...");
        super.onRestore(data, appVersionCode, newState);
    }
}