BackupManager и BackupAgent в Android 2.2

Я просмотрел документы и пример приложения BackupRestore и написал собственное тестовое приложение, реализующее android:backupAgent. Я расширил класс BackupAgent, потому что моей главной заботой является возможность резервного копирования данных из базы данных. Кажется, я даже не могу заставить простое приложение для проверки концепции работать с этой функцией.

Чтобы сделать вещи исключительно простыми, я объявил android:backupAgent как MyBackupAgent в манифесте. Затем я создал класс MyBackupAgent.java, расширив BackupAgent. Затем я создал переопределения для методов onBackup() и onRestore() в классе MyBackupAgent, как в примерах и документах. Я добавил вызов Log.i() в самое начало каждой функции, чтобы в LogCat можно было определить, когда вызывались функции. Точно так же я установил точки останова на обоих из них. Затем я реализовал свой код для резервного копирования базы данных.

Я создал образ эмулятора с помощью API 2.2w/Google и даже добавил учетную запись gmail в разделе «Учетные записи и синхронизация». Выполнение команд adb для включения bmgr, резервного копирования приложения, запуска резервного копирования, удаления приложения, переустановки приложения и т. д. Я ни разу не получил сообщение в файле журнала от команды Log.i() ни в одном из onBackup() или onRestore() функции.

Попробовал еще раз на своем Evo 4g с прошивкой 2.2. Тот же результат. Не похоже, чтобы диспетчер резервного копирования вызывал функции onBackup() и onRestore() в классе MyBackupAgent.

Единственное странное сообщение, которое я получаю в своих журналах, - это одно из BackupManagerService, в котором говорится: «Резервное копирование проходит, но e = true p = false», я полагаю, в ответ на команду ADB для резервного копирования приложения.

Какие-либо предложения? Я ошибаюсь, предполагая, что оператор Log.i() в функциях onBackup() и onRestore() будет отображаться в LogCat?


person wct097    schedule 24.09.2010    source источник


Ответы (3)


ВыходBackup pass but e=true p=false означает, что диспетчер резервного копирования включен (e=true), но не подготовлен (p=false).

Резервное копирование будет выполняться только в том случае, если выполняются оба этих условия. Итак, по какой-то причине менеджер резервного копирования не инициализирован на вашем образе эмулятора, после изучения кода я заметил, что он должен автоматически инициализироваться во время загрузки (DefaultActivity)

I/ActivityManager(   73): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.sdksetup/.DefaultActivity } from pid 0

Я только что создал свежий образ эмулятора, и там он работал без проблем.

person Jan Berkel    schedule 09.01.2011

Я также пытался использовать «новую» службу диспетчера резервного копирования и всегда получал следующие сообщения об ошибках:

12-01 09:58:54.420: WARN/BackupTransportService(9965): Unknown package in backup request: @pm@
12-01 09:58:54.450: WARN/BackupTransportService(9965): Not ready for backup request right now: [OperationScheduler: enabledState=false lastSuccess=2010-10-07/09:33:51 moratoriumSet=2010-12-01/09:53:32 moratorium=1970-01-01/01:00:00 trigger=1970-01-01/01:00:00]
12-01 09:58:54.450: WARN/PerformBackupThread(9965): Backup pass unsuccessful, restaging

Кто-нибудь знает, что это значит???

Если я изменю резервный транспорт на локальную версию с помощью следующей команды

adb shell bmgr transport android/com.android.internal.backup.LocalTransport

все работает хорошо. Так что это не проблема моего кода, я думаю...

С уважением!

person Christian Lischnig    schedule 01.12.2010

Проверьте настройки вашего телефона. Если служба синхронизации отключена, резервное копирование через Data Backup API работать не будет.

person erlando    schedule 05.10.2012