项目例子
问题
- 解耦
- 模块间的通信
- 基础核心模块的构建
- 业务组件化
- 代码边界
- 资源合并
Arouter
配置
各个模块需要配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
kapt {
generateStubs = true
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
build.gradle dependies
compile 'com.alibaba:arouter-api:?'
annotationProcessor 'com.alibaba:arouter-compiler:?'
初始化
// Application中
ARouter.init(mApplication);
// Activity中
ARouter.getInstance().inject(this);
调用
-
Activity 类的头部添加
@Route(path = "/test/activity")
-
跳转目标
ARouter.getInstance().build("/test/activity") .withLong("key1", 666L).navigation();
-
Activity 接收参数
@Autowired(name="key1")public Long key;
dagger2
配置
添加依赖
compile 'com.google.dagger:dagger:2.x'
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
@Conponent
注解修饰的接口或抽象类,负责在@Inject和@Module之间建立连接,当实例化@Inject注解的类时,遇到没有构造函数的成员变量依赖,则该依赖由@Module修饰的类提供
void inject(MainActivity MainActivity)
DaggerActivityComponent.builder().build().inject(this);
@Module
注解修饰的类负责提供那些没有构造函数的类的依赖,如第三方类库,系统类,接口类
方法 @Inject @Provide
-
@Inject
- 1.如果一个成员变量被
@Inject
注解修饰,并且它的类型构造函数也被@Inject
注解修饰 - 2.若类的构造方法使用了该注解,则无需使用
@Provide
来提供初始化该类
- 1.如果一个成员变量被
-
@Provide 用在方法函数上,用于提供目标类的初始化
@Provide public Context provideContext = Application.getInstance()
@Scope 类的作用域限定, 例如:
-
@AppScope
App层级 -
@ActivityScope
Activity层级 -
@FragmentScope
Fragment层级
@Qulifier / @Name
别名,让目标类成员变量的类型 和 创建方法的返回类型 形成一对一的关系,一般来说,使用@Qulifier
是比较标准的方式
@Named
也可以达到相同的效果。还是用上面的例子,我们不需要重新定义两个注解@Local
和@Remote
,而是直接在需要加上别名的两个地方,添加@Named("Local")
和@Named("Remote")
,也就是将@Named
后面括号中的字符串作为关联目标类型的成员变量和创建方法之间的别名
环境配置
模块配置
模块资源使用前缀 避免模块间的资源出现重复,配置资源前缀,
// module的build.gradle配置
resourcePrefix "module_"
manifest配置 release 和 debug
if(isBuildModule.toBoolean()){
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}else{
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
if (isBuildModule.toBoolean()){
apply plugin: 'com.android.application'
}
else{
apply plugin: 'com.android.library'
}