0

我有一个第 3 方库,它通过侦听器接口公开其功能。该库的要求是它在自定义 Android 应用程序类的 onCreate 中被初始化。

public class CustomApplicationWithListener extends Application implements ThirdPartyListener {
   public void onCreate() {
     if(feature.isTurnedOn()){
       // the library requires an application instance of type ThirdPartyListener
       init(this);
     }
   }
}

我试图将此功能隐藏在功能标志后面,并且想知道是否有一种方法可以将侦听器从应用程序类中抽象出来,并且仅在需要该功能时才定义它。只有这样我们才声明该接口。我知道需要在清单中定义自定义应用程序类。有没有办法在运行时动态决定是否启用该功能,然后使用第三方侦听器初始化基本自定义应用程序对象,如下所示,并让主清单知道我们将使用的版本?

var application: Application?
if(feature.isTurnedOn()){
 application = CustomApplicationWithListener()
} else {
 application = CustomApplication
}
4

1 回答 1

1

在运行时在 android 应用程序中完成的代码生成不是一件容易的事,需要使用Reflection. 查看 Java 的 Reflection API 以了解反射的工作原理。

另一方面,编译时的 codegen 并不难,可以通过Annotation Processors. 请参阅此博文以了解注释处理器的工作原理

查看允许用户按需下载特定功能的动态模块。这可能是最适合您的情况的解决方案。设置具有功能标志视图的 PreferenceFragment 并通过解决方案中的 SharedPreferences 读取值。

我仍然质疑你为什么不想在你的类应用程序中声明 3rd 方库。许多第 3 方库通常需要在基础应用程序类中进行实例化。如果库依赖是您的答案,那么可以通过将自己的应用程序拆分为表示、数据和域模块来解决。这至少会将 android 框架与您的业务逻辑隔离开来。

于 2020-04-21T22:13:50.433 回答