编辑于2018-04-30
一、组件化的优势自然是模块的复用。我是分成了三个部分,基础库,各个功能模块,壳模块。
1、一个基础库对应一个壳模块,壳模块中至少需要用到基础库中的application类,其他如theme等也可写在基础库中,也许这些可以写在壳中,还请指教;基础库也会跟着功能模块的不同可能有所不同;最重要的是一些随着app包变化的常量也需要放在基础库中。
2、壳模块中gradle的applicationId决定了包名。
3、功能模块也会因为衔接的模块不同可能需要进行一定的改造,可以使用阿里的arouter路由器判断与之衔接的是哪个模块而采用不同的方案,当然如果一个功能模块改变较大,我们可以尝试细分该功能模块然后再新建对应的模块。关于代码混淆,我选择放在各个模块下。
二、除了壳模块是phone&Table module以外,基础库和功能模块其实都是Android Library。
三、关于butterknife的使用
1、在基础库gradle中compile "com.alibaba:arouter-api:1.1.1"
2、在各个功能模块中apply plugin: 'com.jakewharton.butterknife'和annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
3、在project的gradle中classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
注意这个地方用的是8.4.0,不是最新的,新的有问题
4、安装Android Butterknife Zelezny插件
5、右键setContentView(R.layout.xxx);中的xxx几个字generate选择Generate Butterknife Injections,在弹出框中选择你需要onclick的控件并选择split onClick methods(这里必须分开,放在一起switch(view.getId())则会导致R.id.xxx和R2.id.xxx都找不到)。
6、生成注解后将R.id.xxx改为R2.id.xxx,重新编译就能运行了。
四、arouter的简单使用
1、在各个功能模块和基础库中(因为application中需要初始化Arouter,而我的application又在基础库中)gradle中annotationProcessor 'com.alibaba:arouter-compiler:1.1.1'
2、在各个功能模块gradle中的defaultConfig中添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
3、在支持路由的页面上添加注解
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
4、初始化SDK
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
5、发起路由操作
// a. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();
// b. 跳转并携带参数
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.withObject("key4", new Test("Jack", "Rose"))
.navigation();
6、添加混淆规则(如果使用了Proguard)
-dontwarn com.alibaba.**
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
7、进阶用法参考https://github.com/alibaba/ARouter
五、有时,fragment要调用其对应activity对象的方法,但该activity与fragment又在不同的模块中,这时我推荐使用Otto
六、各个功能模块间可能存在重复命名的资源文件,这样容易造成显示错误。可以将资源文件提取到基础库中,或者给资源文件加上特定前后缀。
编辑于2019-04-27
ARouter实现组件通信的原理
step1:每个上层模块通过编译时注解生成java类(内含获取该模块组件映射表的方法);
step2:用户调用初始化方法,底层模块反射上层模块生成的java类,获取到生成类中到映射表,把各个模块映射表合并成总映射表;
step3:上层模块调用底层模块的这个总映射表,解析映射表获取到其他模块的组件。