我尝试在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;
}
}
答案 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);
}
}