-
Notifications
You must be signed in to change notification settings - Fork 2
3、依赖注入
ModuleExpose方案使用模块暴露&依赖注入框架Hilt的方式,实现模块间通信:
- 使用模块暴露(模块api化)解决基础模块下沉问题
- 使用依赖注入框架Hilt实现基于接口的模块解耦方案
基于模块暴露(ModuleExpose)的相关接口,可以使用依赖注入框架Hilt实现基于接口的解耦; 当然如果大家不使用Hilt技术栈的话,这节可以跳过;
本节内容会以业务模块search和settings为例,通过代码展示:
- search模块跳转到settings模块,打开SettingsActivity
- settings模块跳转到search模块,打开SearchActivity
PS:关于Hilt的配置和导入,本项目直接沿用nowinandroid工程中build-logic的配置,具体配置和使用请参考本项目和nowinandroid项目;
导入脚本之后,使用includeWithExpose导入对应模块,各自生成对应的module_expose,如下图:
注意,请将*_expose/添加到gitignore,避免expose模块提交到git
settings模块expose目录下暴露SettingExpose接口, 脚本会自动将其同步拷贝到settings_expose中对应expose目录
exposeimpl/SettingExposeImpl实现SettingExpose接口的具体功能,完善跳转功能
class SettingExposeImpl @Inject constructor() : SettingExpose {
override fun startSettingActivity(context: Context) {
SettingsActivity.start(context)
}
}
使用Hilt绑定全局单例SettingExpose接口实现,其对应实现为SettingExposeImpl
compileOnly(projects.feature.settingsExpose)
注意,模块暴露依赖只能使用compileOnly,保证编译时候能找到对应文件即可;另外projects.feature.settingsExpose这种项目导入方式,需要在settings.gradle.kts启用project类型安全配置;
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
@AndroidEntryPoint
class SearchActivity : AppCompatActivity() {
@Inject
lateinit var settingExpose: SettingExpose
private val listener = object : AppSettingsPopWindow.Listener {
override fun settings() {
settingExpose.startSettingActivity(this@SearchActivity)
}
}
}
最终实现【search模块跳转到settings模块,打开SettingsActivity】, 至于【settings模块跳转到search模块,打开SearchActivity】的操作完全一致,不重复叙述了;
1、思路原创:微信Android模块化架构重构实践
2、项目原创:github/tyhjh/module_api
3、脚本迁移:将 build 配置从 Groovy 迁移到 KTS
4、参考文章:Android模块化设计方案之接口API化
5、Nowinandroid:https://github.com/android/nowinandroid
6、Dagger项目:https://github.com/google/dagger
7、Hilt官方教程:https://developer.android.com/training/dependency-injection/hilt-android
基于模块暴露和Hilt的安卓模块通信方案



