I am looking into using the new Backup API that available since Android 2.2, but need to maintain backwards compatibility (to 1.5 to be exact).
The docs state:
The backup service and the APIs you must use are available only on devices running API Level 8 (Android 2.2) or greater, so you should also set your android:minSdkVersion attribute to “8”. However, if you implement proper backward compatibility in your application, you can support this feature for devices running API Level 8 or greater, while remaining compatible with older devices.
I indeed build against the level 8 targetSdkVersion with level 3 minSdkVersion and try to use a wrapper class (with reflection) to overcome the problem that the application will not run if you implement a class that extends an nonexisting class.
Here is the problem: since we don’t make actual calls to the BackupHelper class ourselves, we can’t check upfront if the class indeed exists. (As is explained in the Android Backwards Compatibility documentation with a checkAvailable() method.) The class will therefore be instantiated and cast to a BackupAgent. But since we use reflection, it doesn’t actually override BackupAgent and an exception occurs at runtime when the backup is requested:
java.lang.RuntimeException: Unable to create BackupAgent org.transdroid.service.BackupAgent: java.lang.ClassCastException: org.transdroid.service.BackupAgent
Here is my approach to a backwards compatible BackupAgent: http://code.google.com/p/transdroid/source/browse/#svn/trunk/src/org/transdroid/service where the BackupAgent.java is the ‘regular’ BackupAgentHelper-extending class and BackupAgentHelperWrapper is the reflection-based wrapper class.
Anyone successfull in implementing a BackupAgent with backwards compatibility?
I don’t see why you run into this problem.
I have the same issue: I want to support backup with a app that supports also 1.5 (API 3).
There is no problem in creating my
BackupAgentHelperclass, since that class is never called from my own code, but from theBackupManageri.e. the system itself. Therefore I don’t need to wrap it, and I don’t see why you should be doing that:However, you do want to get a backup running, to do that you need to call on
BackupManager.dataChanged()whenever your data changes and you want to inform the system to backup it (using yourBackupAgentorBackupAgentHelper).You do need to wrap that class, since you call it from you application code.
You then call it from your code when you change a preference or save some data.
Some code from my app:
So, hopefully this works for you!
(If you call
adb shell bmgr runevery time you want to emulate the actual system initiated backupprocess it should properly backup and restore when you reinstall the app.)