4

我试图实现一个动态功能,我应该从我的基本模块中调用该功能中的一些方法,但它只能从该功能中调用基本方法,有什么方法可以从基本模块访问功能代码?(我了解未安装功能时会发生什么)

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

今天没有动态功能,我有两个 .apk,我通过 AIDL 使用通信,我试图删除 AIDL 的使用并使用直接调用

4

2 回答 2

4

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

这是我的方法:

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

然后你让实例调用功能代码。

于 2018-08-30T10:25:32.530 回答
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
 }

使用这种方法,您只需进行一次反射调用即可在动态功能模块中创建类的实例,之后您将能够使用编译时间优势,就像使用接口调用方法一样。

于 2021-04-18T17:05:40.290 回答