Я изучаю использование нового Резервного копирования 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
с назад совместимостью?
Вам необходимо установить следующую версию 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
Я столкнулся с той же проблемой, и вот что я сделал, чтобы решить ее.
Вы не расширяете 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, код никогда не будет вызван, поэтому вы также не столкнетесь с исключениями во время выполнения.