Android 模块化/组件化

项目例子

问题

  • 解耦
  • 模块间的通信
  • 基础核心模块的构建
  • 业务组件化
  • 代码边界
  • 资源合并

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来提供初始化该类
  • @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' 
}

你可能感兴趣的:(Android 模块化/组件化)