Android平台中对页面、服务提供路由功能的中间件,我的目标是 —— 简单且够用。
这是阿里对Arouter的定位,那么我们一起来梳理一下Arouter使用流程,和使用中我所遇到的一些问题!
先来看看有哪些功能模块化的要解决的问题
-
模块间页面跳转(路由);
-
模块间事件通信;
-
模块间服务调用;
-
模块的独立运行;
-
模块间页面跳转路由拦截(登录)
- 其他注意事项;
app模块:主模块,主要进行搭载各个模块的功能。
lib_base:对ARouter进行初始化,和放置一些各个模块公用的封装类。
lib_icon:放置图片、assets、xml等公用资源文件
module_home,module_caht,module_recom,module_me:分别对应“首页”、“微聊”、“推荐”、“我的”模块!
ARouter各个模块的gradle配置
- 因为路由跳转是子模块都需要用到的,所以我们在lib_base 模块中引入
compile 'com.alibaba:arouter-api:1.2.4'
annotationProcessor "com.alibaba:arouter-compiler:1.1.4"
包括整个项目中都会用到的其他依赖,例如:
compile 'com.android.support:design:26.0.0-alpha1'
compile 'org.simple:androideventbus:1.0.5.1'
compile 'com.alibaba:fastjson:1.2.9'
因为我把拦截器等公用类在base注册,在编译期间生成路径映射。同时也需要在build中加入
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
- 然后在各子模块的build文件中导入(也就是module_home,module_caht,module_recom,module_me):
/**
* 及时在base已经引入了com.alibaba:arouter-compiler:1.1.4
* 这里也需要引入,不然报错
*/
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
compile project(':lib_base')
compile project(':lib_icon')
在编译期间生成路径映射。同时也需要在各子模块的build中加入:
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
- 在app模块对各个子模块进行依赖:
compile project(':module_home')
compile project(':module_chat')
compile project(':module_recom')
compile project(':module_me')
模块可插拔单独编译运行
模块化的好处之一就是单一模块可以独立的开发编译运行安装到用户的手机上,这样就方便了对某一模块的单独开发调试,单一模块生成的apk体积也小,编译时间也快,开发效率会高很多。
- 项目根目录gradle.properties配置:
# 是否需要单独编译 true表示不需要,false表示需要
isNeedHomeModule=true
#isNeedHomeModule=false
isNeedChatModule=true
#isNeedChatModule=false
isNeedRecomModule=true
#isNeedRecomModule=false
isNeedMeModule=true
#isNeedMeModule=false
- 在各个子模块中配置(例如module_me):
if (!isNeedMeModule.toBoolean()) { apply plugin: 'com.android.application' } else { apply plugin: 'com.android.library' }
defaultConfig {
if (!isNeedMeModule.toBoolean()) {
applicationId "tsou.cn.module_me"
}
}
- 在app主模块中:
if (isNeedHomeModule.toBoolean()) {
compile project(':module_home')
}
if (isNeedChatModule.toBoolean()) {
compile project(':module_chat')
}
if (isNeedRecomModule.toBoolean()) {
compile project(':module_recom')
}
if (isNeedMeModule.toBoolean()) {
compile project(':module_me')
}
如果需要单独运行某个模块时,修改gradle.properties配置,
例如单独运行module_home模块时,开启isNeedHomeModule=false,并且在AndroidManifest.xml的MainActivity添加
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
反之则关闭!