从基础模块调用动态特性代码

4
我正在尝试实现一种动态特性,在我的基本模块中调用该特性的某些方法,但是只能从特性中调用基本方法,有没有办法使特性代码从基本模块中可访问?(我知道当未安装特性时会发生什么)
我已经使用默认的Google文档进行了实现,因此我没有不同的代码或实现。
今天,没有动态特性,我有两个.apks,并且通过AIDL进行通信,我正在尝试删除AIDL使用并使用直接调用。

请查看以下程序相关内容:https://github.com/deepanshu42/dynamic-module-sample 和 https://developer.android.com/guide/app-bundle/playcore - ashishdhiman2007
2个回答

5

我还在尝试使用动态特性模块。

这是我的方法:

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

然后,您就可以获得实例以调用特性代码。


或使用一个界面 - VIN
或使用一个界面 - undefined

0

由于动态特性模块不能在应用程序模块的编译时依赖,因此:

  1. 您需要首先确保该模块已安装:

使用SplitInstallManager的getInstalledModules()方法并检查其是否存在。

使用反射,在你想调用的类中创建一个实例并调用不同的方法:
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
 }

通过这种方法,你只需要进行一次反射调用来在动态特性模块中创建类的实例,之后你就能像使用接口调用方法一样享受到编译时的优势。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接