Instant Apps:使用基本模块中的功能模块而无需强依赖

Instant Apps: Use feature module from base module without strong dependency

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

由于 Instant App 不支持推送通知,我只想为已安装的应用启用 push 模块。但是我在 base 中共享了 classes 调用 push 方法。例如,我在 Application class.

中的应用程序启动期间初始化 push 模块

如何组织依赖项,这样我就不必将 push 模块包含到 base 模块中,而是能够从 base 调用 push 方法?我有一个想法,我可以在 base 模块中创建接口 PushManagerProvider,这样 instantinstalled 就可以提供它们自己的实现,但我不确定如何注入具体的base 的实施取决于当前模块。

假设您使用 dagger 并在您的应用程序中构建一个单例组件 class,这是一种方法。

base 中,定义一个 Injector 接口,您的 @Component class 将扩展该接口。让您的应用程序在您的基础模块中实现一个 InjectorProvider 接口,该接口具有一个 getInjector() 方法,该方法 returns 您构造的组件。该组件将使用提供空操作的模块构建 PushManagerProvider.

然后在你的 push 模块中,创建你的 Application class 的替代实现(扩展你的基础并重命名为 PushAwareApplication?)创建一个组件使用一个提供合法 PushManagerProvider 并使用 merge rules 强制使用新的 PushAwareApplication 名称的匕首模块,当推送内置到您的应用程序模块中时。

你可以这样调用

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

并根据您构建的是可安装应用还是即时应用获得不同的组件实现。

使用匕首可能有更多正确的方法,但这应该可以帮助您入门。

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