невозможно вызвать метод onbackup в Android

#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 =

Также: Расположение SVN для проекта Android BookWorm