Назад совместимый BackupAgent

Я изучаю использование нового Резервного копирования API, настолько доступный начиная с Android 2.2, но потребности поддержать назад совместимость (к 1,5, чтобы быть точным).

Состояние документов:

Резервный сервис и API, которые необходимо использовать, доступны только на устройствах, выполняющих уровень API 8 (Android 2.2) или больше, таким образом, необходимо также установить атрибут android:minSdkVersion на "8". Однако при реализации надлежащей обратной совместимости в приложении можно поддерживать эту функцию для устройств, выполняющих уровень API 8 или больше, оставаясь совместимыми с более старыми устройствами.

Я действительно создаю против уровня 8 targetSdkVersion с уровнем 3 minSdkVersion и попытайтесь использовать класс обертки (с отражением) для преодоления проблемы, которую приложение не выполнит при реализации класса, который расширяет несуществующий класс.

Вот проблема: так как мы не выполняем фактические вызовы к BackupHelper класс самостоятельно, мы не можем проверить заранее, если класс действительно существует. (Как объяснен в Android Назад документацию Совместимости с a checkAvailable() метод.) Класс поэтому инстанцируют и бросят к a 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, является основанным на отражении классом обертки.

Любой успешный в реализации a BackupAgent с назад совместимостью?

6
задан HitOdessit 29 October 2012 в 08:40
поделиться

2 ответа

Вам необходимо установить следующую версию minSDK:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"/>

и установить цель сборки на sdk 8 (свойства проекта в eclipse '.default.properties'):

# Project target.
target=android-8

Теперь, чтобы вызовите новые вещи, добавленные в SDK 8, вы должны использовать отражение: http://developer.android.com/resources/articles/backward-compatibility.html

1
ответ дан 8 December 2019 в 12:18
поделиться

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

Вы не расширяете BackupAgent с помощью обертки, вы расширяете его с помощью обернутого класса. Итак, вы создаете свой настоящий класс резервного копирования:

public class MyBackup extends BackupAgent {

@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
        ParcelFileDescriptor newState) throws IOException {
    // TODO Auto-generated method stub

}

@Override
public void onRestore(BackupDataInput data, int appVersionCode,
        ParcelFileDescriptor newState) throws IOException {
    // TODO Auto-generated method stub

}

Хорошо, а затем вы создаете обертку, как сказано в статье android developer backwards compatibility. Обратите внимание, что этот класс не расширяет BackupAgent:

public class WrapMyBackup {
private MyBackup wb;

static {
    try {
        Class.forName("MyBackup");
    }
    catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

/** call this wrapped in a try/catch to see if we can instantiate **/
public static void checkAvailable() {}

public WrapMyBackup() {
    wb = new MyBackup();
}

public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
        ParcelFileDescriptor newState) throws IOException {
    wb.onBackup(oldState, data, newState);

}

public void onRestore(BackupDataInput data, int appVersionCode,
        ParcelFileDescriptor newState) throws IOException {
    wb.onRestore(data, appVersionCode, newState);

}

public void onCreate() {
    wb.onCreate();
}

public void onDestroy() {
    wb.onDestroy();
}

}

Наконец, в своем манифесте вы объявляете обертку в качестве агента резервного копирования:

    <application 
    android:label="@string/app_name"
    android:icon="@drawable/ic_launch_scale"
    android:backupAgent="WrapMyBackup"
    >

Поскольку ваша обертка имеет определенные методы, вы не столкнетесь с проблемой, когда менеджер резервного копирования преобразует ее в BackupAgent. Поскольку более низкие уровни API не имеют BackupManager, код никогда не будет вызван, поэтому вы также не столкнетесь с исключениями во время выполнения.

1
ответ дан 8 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: