从基本模块调用动态功能代码

时间:2018-07-25 21:52:13

标签: android module dynamic-feature

我试图实现一个动态功能,我应该从我的基本模块中调用该功能中的某些方法,但是只能从该功能中调用基本方法,有没有办法使功能代码可从基本中访问模块? (我知道未安装功能会发生什么情况

我已经使用默认的Google文档实现了它,所以我没有不同的代码或实现方式

今天没有动态功能,我有两个.apks,我通过AIDL使用通讯,我试图删除AIDL的使用并使用直接呼叫

2 个答案:

答案 0 :(得分:2)

我也在尝试动态功能模块。

这是我的方法:

  1. 在基本应用程序中保留基本抽象类。
  2. 在动态功能中实现基类。
  3. Feature feature = (Feature) Class.forName("full.class.name.FeatureImpl").newInstance();

然后,您可以实例调用功能代码。

答案 1 :(得分:0)

因为您不能在应用程序模块上拥有动态功能模块的编译时依赖性:

  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
 }

使用这种方法,您只需进行一次反射调用即可在动态功能模块中创建类的实例,之后您将能够使用编译时优势,因为您将使用以下方法调用方法界面。