我正在研究使用从Android 2.2开始提供的新备份API,但需要保持向后兼容性(精确到1.5)。

文档状态:



我的确以8级targetSdkVersion和3级minSdkVersion进行构建,并尝试使用包装器类(带有反射)来解决如果实现扩展不存在的类的类,应用程序将无法运行的问题。

这是问题所在:由于我们自己没有实际调用BackupHelper类,因此无法预先检查该类是否确实存在。 (如Android Backwards Compatibility文档中使用checkAvailable()方法所述。)因此,该类将被实例化并转换为BackupAgent。但是,由于我们使用反射,因此它实际上并不会覆盖BackupAgent,并且在运行时会在请求备份时发生异常:

java.lang.RuntimeException: Unable to create BackupAgent org.transdroid.service.BackupAgent: java.lang.ClassCastException: org.transdroid.service.BackupAgent

这是我向后兼容的BackupAgent的方法:http://code.google.com/p/transdroid/source/browse/#svn/trunk/src/org/transdroid/service,其中BackupAgent.java是“常规” BackupAgentHelper扩展类,而BackupAgentHelperWrapper是基于反射的包装器类。

有人成功实现了向后兼容的BackupAgent吗?

最佳答案

我不明白您为什么遇到这个问题。

我有一个相同的问题:我想使用也支持1.5(API 3)的应用程序支持备份。

创建BackupAgentHelper类没有问题,因为该类从不从我自己的代码调用,而是从BackupManager即系统本身调用。因此,我不需要包装它,也看不出为什么要这样做:

 public class MyBackupAgentHelper extends BackupAgentHelper {
 @override onCreate()
 {
       \\do something usefull
 }

但是,您确实希望运行备份,为此,您需要在数据更改时调用BackupManager.dataChanged(),并且想要通知系统进行备份(使用BackupAgentBackupAgentHelper)。

您确实需要包装该类,因为您是从应用程序代码中调用它的。

public class WrapBackupManager {
private BackupManager wrappedInstance;

static
{
    try
    {
        Class.forName("android.app.backup.BackupManager");
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }
}
public static void checkAvailable() {}

public void dataChanged()
{
    wrappedInstance.dataChanged();
}

public WrapBackupManager(Context context)
{
    wrappedInstance = new BackupManager(context);
}

}

然后,当您更改首选项或保存一些数据时,可以从代码中调用它。
我的应用中的一些代码:

private static Boolean backupManagerAvailable = null;

    private static void postCommitAction() {


        if (backupManagerAvailable == null) {
            try {
                WrapBackupManager.checkAvailable();
                backupManagerAvailable = true;
            } catch (Throwable t) {
                backupManagerAvailable = false;
            }
        }

        if (backupManagerAvailable == true) {
            Log.d("Fretter", "Backup Manager available, using it now.");
            WrapBackupManager wrapBackupManager = new WrapBackupManager(
                    FretterApplication.getApplication());
            wrapBackupManager.dataChanged();
        } else {
            Log.d("Fretter", "Backup Manager not available, not using it now.");
        }

因此,希望这对您有用!

(如果每次要模拟实际的系统启动的备份过程时都调用adb shell bmgr run,则应在重新安装该应用程序时正确备份和还原该过程。)

关于android - 向后兼容的BackupAgent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3083175/

10-13 04:21