Вызов динамического кода объекта из базового модуля

Я пытаюсь реализовать динамическую функцию, где из моего базового модуля я должен вызывать некоторые методы в функции, но это только возможно вызвать базовые методы из функции, есть ли способ сделать код функции доступным из базового модуля? (я понимаю, что может случиться, если функция не установлена)

Я реализовал это, используя стандартные документы Google, поэтому у меня нет другого кода или реализации

Сегодня без динамической функции у меня есть два.apks, и я использую связь через AIDL, я пытаюсь удалить использование AIDL и использовать прямой вызов

2 ответа

Я также пробую динамические функциональные модули.

Вот мой подход:

  1. Держите базовый абстрактный класс в базовом приложении.
  2. Реализует базовый класс в динамическом объекте.
  3. Feature feature = (Feature) Class.forName("full.class.name.FeatureImpl").newInstance();

Затем вы получили экземпляр для вызова кода функции.

Поскольку у вас не может быть зависимости от времени компиляции модуля динамических функций от модуля приложения:

  1. Вам необходимо сначала убедиться, что модуль установлен:

Используйте метод SplitInstallManager, getInstalledModules() и убедитесь, что он существует.

  1. Используя отражение, создайте экземпляр класса, который вы хотите вызвать, и вызовите разные методы:

            Class<?> dynamicFeatureClass = Class.forName("packagename.DFClass")
    Constructor<?> cons = dynamicFeatureClass.getConstructor();
    Object dynamicFeatureClassInstance = cons.newInstance();
    

Теперь, используя отражение, вы можете вызывать разные методы.

  1. Было бы лучше, если бы вы определили общий интерфейс в своем базовом модуле и реализовали эти методы в своем динамическом классе пространственных объектов.

Тогда вы сможете:

      FeatureContract feature = (FeatureContract) dynamicFeatureClassInstance;

// In the base module.
public interface FeatureContract
{
     void performSomething();
}


// In the dynamic feature module.
DFClass implements FeatureContract
{
     performSomething()
     {
          //code
     }

      //other Class methods
 }

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

Другие вопросы по тегам