首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向后兼容BackupAgent

向后兼容BackupAgent
EN

Stack Overflow用户
提问于 2010-06-21 08:48:11
回答 6查看 2.7K关注 0票数 6

我正在考虑使用从Android2.2开始提供的新的备份API,但是需要保持向后兼容性(确切地说是1.5 )。

文档声明:

备份服务和必须使用的API仅在运行APILevel8(Android2.2)或更高版本的设备上可用,因此您还应该将android属性设置为"8“。但是,如果在应用程序中实现了适当的向后兼容性,则可以为运行API级别8或更高级别的设备支持此功能,同时保持与旧设备的兼容性。

实际上,我使用级别3的targetSdkVersion针对8级minSdkVersion进行构建,并尝试使用包装类(带有反射)来克服应用程序如果实现扩展不存在类的类将无法运行的问题。

问题是:由于我们没有亲自对BackupHelper类进行实际调用,所以不能预先检查类是否确实存在。(正如Android向后兼容性文档与checkAvailable()方法所解释的那样。)因此,类将被实例化并转换为BackupAgent。但是,由于我们使用反射,它实际上并不覆盖BackupAgent,当请求备份时,在运行时会出现异常:

代码语言:javascript
运行
复制
java.lang.RuntimeException: Unable to create BackupAgent org.transdroid.service.BackupAgent: java.lang.ClassCastException: org.transdroid.service.BackupAgent

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

有谁成功地实现了具有向后兼容性的BackupAgent

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-17 12:54:58

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

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

创建我的BackupAgentHelper类没有问题,因为这个类从来不是从我自己的代码中调用的,而是从BackupManager (即系统本身)调用的。因此,我不需要包装它,我也不明白你为什么要这样做:

代码语言:javascript
运行
复制
 public class MyBackupAgentHelper extends BackupAgentHelper {
 @override onCreate()
 { 
       \\do something usefull
 }

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

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

代码语言:javascript
运行
复制
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);
}

}

然后,在更改首选项或保存某些数据时,从代码中调用它。我的应用程序中的一些代码:

代码语言:javascript
运行
复制
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,那么在重新安装应用程序时,它应该正确地进行备份和恢复。)

票数 7
EN

Stack Overflow用户

发布于 2010-12-17 07:34:13

作为另一种选择,您只需使用纯反射来与BackupManager对话:

代码语言:javascript
运行
复制
public void scheduleBackup() {
    Log.d(TAG, "Scheduling backup");
    try {
        Class managerClass = Class.forName("android.app.backup.BackupManager");
        Constructor managerConstructor = managerClass.getConstructor(Context.class);
        Object manager = managerConstructor.newInstance(context);
        Method m = managerClass.getMethod("dataChanged");
        m.invoke(manager);
        Log.d(TAG, "Backup requested");
    } catch(ClassNotFoundException e) {
        Log.d(TAG, "No backup manager found");
    } catch(Throwable t) {
        Log.d(TAG, "Scheduling backup failed " + t);
        t.printStackTrace();
    }
}

指出android:将backupAgent直接指向v2.2类;它永远不会加载在v2.2VM之前,因此不会出现任何链接问题。

票数 10
EN

Stack Overflow用户

发布于 2010-06-21 10:30:37

您需要将minSDK版本设置为:

代码语言:javascript
运行
复制
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"/>

并将构建目标设置为sdk 8( eclipse‘.default.properties’中的项目属性):

代码语言:javascript
运行
复制
# Project target.
target=android-8

现在,要调用SDK 8中添加的新内容,必须使用反射:http://developer.android.com/resources/articles/backward-compatibility.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3083175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档