Чтобы настроить таргетинг на несколько платформ, вы указываете минимальный уровень SDK и целевой уровень SDK при создании проекта. Вы настраиваете проект для привязки к целевой SDK-сборке. VMWiki Davlik будет генерировать исключения во время выполнения, если вы выполняете вызов против метода, который отсутствует на текущей платформе. Компилятор будет генерировать предупреждения для вызовов, которые недоступны на минимальном уровне SDK. Существуют различные объявления Java @, которые подавляют эти предупреждения о классах, методах или конкретных ссылках. Нажмите клавишу F2 в Eclipse, чтобы автоматически генерировать декор Java, который подходит. Это звучит пугающе. Но на практике предупреждения позволяют кодировать относительно бесстрашно.
Таким образом, общий подход: ссылка на целевые библиотеки SDK; добавьте @ украшения в код, который использует методы из более высоких построений SDK; украсить методы или классы, специфичные для конкретной сборки; и жить и умереть с помощью правила кодирования «все предупреждения являются ошибками».
Повторное внедрение всей активности для каждого уровня API является излишним. Классовая специализация с использованием сложных методов не является счастливым способом делать подобные вещи. Сложность привязки затрудняет работу таким образом. Гораздо лучше использовать меньший вспомогательный класс или условный код.
Существуют различные соглашения о написании классов помощников - по существу отдельный класс реализации для каждого уровня API, каждый из которых реализует общий интерфейс или абстрактный базовый класс. Метод, приведенный в блоге разработчиков Android, является достаточно аккуратным способом сделать это. На шаблоне существует множество незначительных вариаций, основанных на получении экземпляра вспомогательного класса для определенного уровня API.
Другим примером этого шаблона будет интерфейс IActionBarHelper, используемый в библиотеке google ActionBarCompat. В этом случае ваши действия наследуют от ActivityCompat, а не Activity, а метод экземпляра ActivityCompat.getActionBarHelper() возвращает реализацию IActionBarHelper, которая обеспечивает соответствующую реализацию для платформы, на которой вы работаете.В этом случае реализации содержат справедливую бит состояния инициализации и состояние, связанное с активностью; поэтому имеет смысл получить реализацию из метода-члена.
Несмотря на все это, Davlik VM отлично справляется с встроенными методами, которые не имеют связи.
if (Build.Version >= 10) {
Call an API 10 method.
}
также работает отлично. Davlik VM немного скулит через отладочные сообщения в LogCat. Поэтому, если вы будете делать это все время, может быть накладные расходы. Если вы собираетесь выполнить метод API-10 на платформе нижнего уровня, загрузчик Davlik генерирует код, который генерирует исключение во время выполнения при выполнении вместо выполнения вызова. Но коды ссылок и нагрузки прекрасны. Оператор if - это все, что вам нужно, чтобы предотвратить выполнение отсутствующего метода. В небольших дозах условный код в порядке. Если есть много кода, специфичного для платформы, возможно, лучше каким-то образом инкапсулировать платформенный функционал в класс.
Для функций, которые либо есть, либо нет, например, пример вашего NFC, лучший способ продолжить работу, вероятно, реализовать как можно больше функциональности NFC в классе; а затем условно ссылаться на этот класс из кода в вашем основном классе или деятельности. например .:
void onCreate(...)
{
if (Build.Version >= 10)
{
mNfcReceiver = new NfcReceiver(getContext());
}
}
Шаблон класса Helper не помогает вам много, так как вы, очевидно, не собирается повторно реализовать функциональные возможности на платформах нижнего уровня.
Я бы предположил, что вы можете использовать '' Build.VERSION'' для маскировки между различными уровнями API, на которых работает ваше приложение. Затем действуйте соответственно на уровне кода, используя if-elses. – harism
Проблема в том, что в файле манифеста мне нужно указать minSdkVersion. Если я хочу построить компонент, поддерживаемый из minSdkVersion = 10, я не могу скомпилировать пакет с minSdkVersion = 8. Поэтому я хотел бы загрузить дополнительный динамический компонент ... как-то :) – user1908375
Я боюсь, что единственный способ заключается в компиляции с использованием самого высокого API, который вы используете, и убедитесь, что ни один из вызовов API более высокого уровня не вызван на более низких API-интерфейсах. – harism