Можно загружать только определенные строки кода в соответствии с версией ОС Android? - PullRequest
7 голосов
/ 24 августа 2010

Существует ли простая строка кода, которая позволяла бы загружать код только в том случае, если версия ОС соответствует требованиям?

Допустим, у меня целевая ОС равна 2.2, но min sdk равен 3 для android 1.5, поэтому даже если у меня есть некоторый код в моем проекте, который не совместим с 1.5, он все равно будет компилироваться, поскольку целевая ОС2.2.В любом случае, я хочу объявить функцию, для которой требуется код, которого нет в 1.5 SDK, и он вызовет сбой, если он будет загружен на телефон 1.5.Есть ли такая простая вещь, которую я могу сделать?Так что мне не нужно делать все приложение недоступным для 1,5 пользователей?

 if (Android OS == >2.1){
            //Insert code here that requires 2.1 and up}
        else{
            //insert code that would appear is OS is <2.1}

Ответы [ 4 ]

11 голосов
/ 24 августа 2010

Да, вы можете сделать это.На самом деле есть несколько способов.(Примечание: единственная часть этого ответа, относящаяся к Android, - это способ определения версии платформы.)

Предположим, что класс X имеет метод void y() в версии 2.0 и выше, но не раньше.

Один из способов вызвать этот метод без введения каких-либо зависимостей времени компиляции - использовать отражение, чтобы найти метод и вызвать invoke для него.Например:

X x = ...
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) {
    // (exception handling omitted ...)
    Method m = c.getClass().getDeclaredMethod("y");
    m.invoke(x);
}

Другим способом является создание API-интерфейса адаптера совместимости версий для вашего приложения, например:

/** Version compatibility adapter API */
interface Compat {
    void doY();
}

/** Adapter class for version 1 */
class CompatV1 {
    public void y(X x) {
       // do nothing
    }
}

/** Adapter class for version 2 */
class CompatV2 {
    public void y(X x) {
       x.y();
    }
}

// 
// Code to instantiate the relevant adapter for the current platform.
//
Class<?> compatClass;
// (Exception handling omitted)
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) {
    compatClass = Class.forName("...CompatV1");
} else {
    compatClass = Class.forName("...CompatV2");
}
// (Exception handling omitted)
Compat compat = (Compat) compatClass.newInstance();

// The adapter object can be passed around as a parameter, wrapped
// as a singleton or injected using dependency injection.

// Invoke X.y() as follows:

X x = ...
compat.y(x);

Вторая версия выглядит немного тяжелой, но имеет свои преимуществачто динамический (медленный, не типобезопасный) код выполняется только один раз, и что код, зависящий от версии, изолирован от остальной части кода.В реальной жизни вы, вероятно, добавили бы несколько методов в интерфейс адаптера.

Этот подход требует немного больше размышлений, чтобы разработать интерфейс API совместимости, чтобы он четко изолировал зависимости версий от остальной части кода.Возможно, вам также придется пересмотреть API-интерфейс адаптера и создать новые классы адаптеров для каждого нового (несовместимого) основного выпуска.

Наконец, если API-интерфейс платформы изменится, вам нужно будет адаптировать его для использования классов или методов вЕсли в более старой версии удалены , то в более новой версии вам потребуется скомпилировать различные классы адаптеров (например, классы CompatV*), используя разные Android SDK.Это значительно усложнит процессы сборки.


Чтобы узнать о других проблемах, прочитайте следующие статьи в блоге Android:

2 голосов
/ 24 августа 2010
0 голосов
/ 24 августа 2010

Вы можете проверить с помощью Build.VERSION.RELEASE, он дает вам текущую версию вашей системы Android (1.5,1.6,2.1,2.2)

Есть еще Build.VERSION

0 голосов
/ 24 августа 2010
...