Динамическая загрузка классов для нескольких версий Android

1

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

Мне просто интересно, как я могу добиться этого без ошибок компиляции в моем проекте Eclipse. Я имею в виду, что проект настроен для конкретной цели (1.5, 2.1...), поэтому, если класс в моем проекте не совместим с выбранной целью, это приведет к ошибкам.

Есть ли способ экспортировать эти классы, даже если они не подходят для платформы (я думал об отдельной библиотеке, но опять же: как скомпилировать классы тезисов в lib без компиляции pbs?)? Это должно быть нормально, так как они не будут загружены, пока я не попрошу их после проверки версии Android.

Спасибо!

Теги:
classloader

2 ответа

0
Лучший ответ

Вы можете использовать Class.forName для загрузки разных классов в зависимости от разных условий:

public interface MyType {}
public class MyTypeOn15 implements MyType {}
public class MyTypeOn16 implements MyType {}
public class MyTypeOn20 implements MyType {}
// ...

и где-то еще в вашем коде:

MyType myType = null;
if (getActualTarget().equals("1.5") {
   myType = Class.forName("MyTypeOn15").newInstance();
} else if (getActualTarget().equals("1.6") {
   myType = Class.forName("MyTypeOn16").newInstance();
} // ...

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

  • 0
    Спасибо за ваш ответ! Под магическим методом ты имеешь в виду, что его не существует, и я должен написать это сам? :) Это то, что я пытаюсь сделать, получив доступ к android.os.Build.VERSION_CODES, но его не существует в 1.5 ... Так что мне нужен способ проверить версию платформы для более старых версий (возможно, отсутствие этого поля может быть критерием?). Я бы хотел, чтобы этот магический метод существовал :). Но моя проблема заключалась в том, как у вас есть файлы MyTypeOn15.java в моем проекте без ошибок компиляции из-за того, что я выбрал несовместимую цель Android? Спасибо
  • 0
    О, это не имеет большого значения. Создайте отдельные проекты, в которых совпадают цели и классы, а при создании развертываемого объекта просто скопируйте все эти классы в одну библиотеку. Затем библиотека содержит классы, которые не будут работать в реальной среде, но это не имеет значения, потому что они не используются и не загружаются.
Показать ещё 3 комментария
0

Если вы скомпилируете проект с последней целью, то есть 2.2, он все равно будет работать на 1.5.

  • 0
    Это даже отдаленно не верно. Существует ряд методов (в частности, в пакете телефонии, например), которые включены в 2.2, но не в 1.5. Может быть и наоборот, но тогда вы не сможете использовать новые функции.
  • 0
    Ну, я не сказал, что вы можете использовать любую функциональность 2.2 и работать на 1.5. Я сказал, что вы можете скомпилировать 1.5 совместимый код с 2.2, и он будет работать на 1.5. Этот парень хочет написать такой код, который действительно возможен.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню