Динамически создавать класс приложения в Android - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть сторонняя библиотека, которая предоставляет свои функциональные возможности через интерфейс слушателя. Требование библиотеки заключается в том, что она инициализируется в onCreate пользовательского Android класса приложения.

public class CustomApplicationWithListener extends Application implements ThirdPartyListener {
   public void onCreate() {
     if(feature.isTurnedOn()){
       // the library requires an application instance of type ThirdPartyListener
       init(this);
     }
   }
}

Я пытался скрыть эту функциональность за флагом функции и задавался вопросом, есть ли способ абстрагировать слушателя от класса приложения и определять его только тогда, когда функция необходима. Только тогда мы объявляем этот интерфейс. Я знаю, что пользовательский класс приложения должен быть определен в манифесте. Есть ли способ динамически решить во время выполнения, что если функция включена, то инициализировать базовый объект пользовательского приложения сторонним слушателем, как показано ниже, и сообщить основному манифесту версию, которую мы будем использовать?

var application: Application?
if(feature.isTurnedOn()){
 application = CustomApplicationWithListener()
} else {
 application = CustomApplication
}

1 Ответ

1 голос
/ 22 апреля 2020

Генерация кода, выполняемая в приложении android во время выполнения, не простая задача, и она будет выполняться с помощью Reflection. Взгляните на Reflection API Java, чтобы понять, как работает отражение.

С другой стороны, кодегин времени компиляции не так уж и сложен и может быть достигнут с помощью Annotation Processors. Обратитесь к этому посту, чтобы понять, как работают процессоры аннотаций .

. Посмотрите на модули Dynami c, которые позволяют пользователям загружать определенные c функции по запросу. Это может быть наиболее подходящим решением для вашего случая. Настройка PreferenceFragment, имеющего представления признаков объектов, и чтение значения через SharedPreferences в решении.

Я все еще задаюсь вопросом, почему вы не хотите объявлять стороннюю библиотеку в своем приложении класса. Многие сторонние библиотеки часто требуют инстанцирования в базовом классе приложения. Если вашим ответом является зависимость от библиотеки, то это можно решить, разделив собственное приложение на модуль представления, данных и предметной области. Это как минимум изолирует android каркас от вашей бизнес-логики c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...