1

我正在尝试在我的 Android 应用中实现新的 Instant App 功能。我有 4 个模块:

  • 具有所有活动和逻辑的基本功能模块:base
  • 具有推送通知类的功能模块:push
  • 安装的应用模块:installed
  • 即时应用模块:instant

由于 Instant App 不支持推送通知,我只想push为已安装的应用启用模块。但是我在base那个调用push方法中共享了类。例如,我push在应用程序类中的应用程序启动期间初始化模块。

我如何组织依赖关系,所以我不必包含push模块到base模块,而是能够pushbase? 我有一个想法,我可以PushManagerProviderbase模块中创建接口,instant并且installed可以提供自己的实现,但我不确定如何base根据当前模块注入具体实现。

4

1 回答 1

2

假设您使用 dagger 并且您在 Application 类中构建了一个单例组件,这是一种方法。

base中,定义Injector您的@Component类扩展的接口。让您的基础模块中的应用程序实现一个InjectorProvider接口,该接口具有一个getInjector()返回您构造的组件的方法。该组件将使用提供 no-op 的模块构建PushManagerProvider

然后在您的push模块中,创建您的类的替代实现Application(扩展您的基并重命名为PushAwareApplication?)这将创建一个使用 dagger 模块的组件,该模块提供合法PushManagerProvider并使用合并规则PushAwareApplication在 push 内置到您的时强制使用新名称应用模块。

这样你就可以调用

((InjectorProvider)getApplication()).getInjector().inject(this);

并根据您是构建可安装应用程序还是免安装应用程序来获得不同的组件实现。

使用匕首可能有更正确的方法,但这应该让你开始。

如果您不使用 dagger,则可以使用上述相同的应用程序覆盖技术,两个应用程序实现都实现了提供“getPushManagerProvider()”方法的接口。

于 2017-05-31T03:17:38.150 回答