#android #android-backup-service
#Android #android-backup-service
Вопрос:
Я хочу реализовать резервное копирование и восстановление, но он не выполняет onBackup()
метод. Мой код в файле манифеста
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:backupAgent="MyBackupAgent" android:restoreAnyVersion="true"
android:allowBackup="true" android:enabled="true">
<meta-data android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIMiLZ2_rMQFv6Huz3BYWpuxfVoK68Wk0CFMiXwA" />
<activity android:name=".Splash" android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Activity
Когда я добавляю или обновляю какой-либо элемент, я хочу сделать резервную копию, поэтому мой код
BackupManager bm = new BackupManager(this);
bm.dataChanged();
и в MyBackupAgent
файле я написал
public class MyBackupAgent extends BackupAgent {
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
ParcelFileDescriptor newState) throws IOException {
// TODO Auto-generated method stub
System.out.println("in MyBackupAgent");
}
@Override
public void onRestore(BackupDataInput data, int appVersionCode,
ParcelFileDescriptor newState) throws IOException {
// TODO Auto-generated method stub
}
}
Но здесь, в onBackup()
методе, он ничего не печатает, так как я могу определить, вводится ли он в метод onbackup или нет?
Ответ №1:
Вы пробовали запускать «adb shell bmgr run» в командной строке?
Это заставит диспетчер резервного копирования выполнять свою работу.
Кажется, что dataChanged()
это планирует работу. Но работа не выполняется (ждет вечно), если не принудительно, как описано выше.
Ответ №2:
Может ли это быть проблемой?:
Только диспетчер резервного копирования может вызвать метод onBackup () вашего агента резервного копирования. Каждый раз, когда данные вашего приложения изменяются и вы хотите выполнить резервное копирование, вы должны запросить операцию резервного копирования, вызвав dataChanged() (см. Запрос резервного копирования для получения дополнительной информации). Запрос на резервное копирование не приводит к немедленному вызову вашего метода onBackup(). Вместо этого диспетчер резервного копирования ожидает соответствующего времени, а затем выполняет резервное копирование для всех приложений, которые запрашивали резервное копирование с момента последнего резервного копирования. было выполнено.
http://developer.android.com/guide/topics/data/backup.html#BackupAgent
Ответ №3:
Просто пример, который вы можете попробовать:
http://www.edumobile.org/android/android-development/backup-manager/
РЕДАКТИРОВАТЬ: извините, я неправильно прочитал ваш XML, вы можете попытаться удалить этот тег на Manifest
<meta-data android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIMiLZ2_rMQFv6Huz3BYWpuxfVoK68Wk0CFMiXwA" />
@p / s: Если вы можете поделиться кодом, это может немного помочь.
Комментарии:
1. Спасибо за ваш быстрый ответ, я применил оба ваших совета, но все равно ничего не печатаю
2. Вы объявляете
BackupManager
как член класса? Вызываете ли выdataChanged()
на месте изменение данных?
Ответ №4:
У меня такая же проблема. Если я запускаю «adb shell bmgr run», резервное копирование выполняется успешно, однако я не могу заставить dataChanged() что-либо делать? У меня все настроено правильно, потому что резервное копирование выполняется с помощью команды adb; действительно ли для планирования требуется вечность? Я скопировал свой apk на свой телефон, и dataChanged() там тоже ничего не сделал. Я надеялся, что смогу сообщить пользователю, что резервное копирование прошло успешно, но это кажется невозможным, поскольку планирование этого скрыто (если это действительно то, что происходит).
Комментарии:
1. Я более внимательно прочитал документацию, она действительно планирует резервное копирование, когда ему заблагорассудится: только менеджер резервного копирования может вызвать метод onBackup () вашего агента резервного копирования. Каждый раз, когда данные вашего приложения изменяются и вы хотите выполнить резервное копирование, вы должны запросить операцию резервного копирования, вызвав dataChanged() . Запрос на резервное копирование не приводит к немедленному вызову вашего метода onBackup(). Вместо этого диспетчер резервного копирования ожидает соответствующего времени, а затем выполняет резервное копирование для всех приложений, которые запросили резервное копирование с момента последнего резервного копирования. было выполнено.
Ответ №5:
У меня была точно такая же проблема и добавление
static
{
try
{
Class.forName("android.app.backup.BackupManager");
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
внутри моего класса MyBackupAgent проблема решена. До этого мой onBackup никогда не вызывался. Я, наконец, понял это, наткнувшись на Android Book Worm, который, похоже, является рабочим примером.
Я также изменил строку в AndroidManifest.xml от
android:backupAgent="MyBackupAgent"
Для
android:backupAgent=".MyBackupAgent"
но я не уверен, что это что-то сделало.
Вот ссылка, которая мне помогла: ого.поиск сетевого кода для Android: BackupAgent =