【问题标题】:Call dynamic feature code from base module从基本模块调用动态功能代码
【发布时间】:2019-01-02 19:44:24
【问题描述】:
我试图实现一个动态功能,我应该从我的基本模块中调用该功能中的一些方法,但它只能从该功能中调用基本方法,有什么方法可以从基本模块中访问功能代码模块? (我了解未安装功能时会发生什么)
我已经使用默认的谷歌文档实现了它,所以我没有不同的代码或实现
今天没有动态功能,我有两个 .apk,我通过 AIDL 使用通信,我试图删除 AIDL 的使用并使用直接调用
【问题讨论】:
标签:
android
module
dynamic-feature
【解决方案1】:
我也在尝试动态功能模块。
这是我的方法:
- 在基础应用中保留基础抽象类。
- 在动态特性中实现基类。
Feature feature = (Feature) Class.forName("full.class.name.FeatureImpl").newInstance();
然后你让实例调用功能代码。
【解决方案2】:
因为您不能在应用模块上拥有动态功能模块的编译时间依赖性:
- 您需要先确保模块已安装:
使用 SplitInstallManager 的 getInstalledModules() 方法并检查它是否存在。
-
使用反射,创建您要调用的类的实例并调用不同的方法:
Class<?> dynamicFeatureClass = Class.forName("packagename.DFClass")
Constructor<?> cons = dynamicFeatureClass.getConstructor();
Object dynamicFeatureClassInstance = cons.newInstance();
使用反射,您现在可以调用不同的方法。
- 最好在基本模块中定义一个通用接口并在动态要素类中实现这些方法。
那么你可以这样做:
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
}
使用这种方法,您只需进行一次反射调用即可在动态功能模块中创建类的实例,之后您将能够使用编译时间优势,因为您将使用调用方法界面。