一、组件化的好处
1、架构清晰业务组件间完成接耦合。
2、每个业务组件都可以根据BU需求完成独立app发布。
3、开发中使开发者更加轻松,开发中加快功能开发调试的速度。
4、业务组件整体删除添加替换变得非常轻松,减少工程中的代码资源等冗余文件。
5、业务降级,业务组件在促销高峰期间可以业务为单元关闭,保证核心业务组件的顺利执行。
二、基础搭建
1.框架思路
2.项目结构图
三、组件化过程
1.分别创建app、common、module_main、module_market四个子工程
2.明确分工
壳app:app
公共的library:common
业务子组件:module_main和module_market
3.组件模式和集成模式设置: isModule
(1).我们在大工程的gradle.properties中定义一个常量值 isModule(是否是组件开发模式,true为是组件模式,false为集成模式):
(2).common模块作为library,build.gradle中设置libary
(3).在module_main和module_market的build.gradle文件下区分组件模式和集成模式
if(isModule.toBoolean()){//组件模式:app
apply plugin: 'com.android.application'
}else {//集成模式:libary
apply plugin: 'com.android.library'
}
(4).效果如下:
4.组件模式和集成模式下的AndroidManifest读取问题
(1).
组件模式下:在main目录下新建一个文件夹module,创建AndroidManifest.xml;
集成模式下:默认的AndroidManifest.xml位置,
(2).module_main和module_market在组件模式和集成模式下的AndroidManifest.xml区别
common的AndroidManifest.xml内容如下
(3).在各自的build.gradle文件区分加载组件和集成模式下的AndroidManifest.xml文件;
(4).组件模式下,作为独立的app才设置appid
5.依赖关系
app依赖common;
集成模式下,app依赖module_main和module_market;
module_main和module_market依赖common;
app的build.gradle
module_main的build.gradle
module_market的build.gradle
6.全局Context的获取
BaseApplication 主要用于各个业务组件和app壳工程中声明的 Application 类继承用的,只要各个业务组件和app壳工程中声明的Application类继承了 BaseApplication,当应用启动时 BaseApplication 就会被动实例化,这样从 BaseApplication 获取的 Context 就会生效,也就从根本上解决了我们不能直接从各个组件获取全局 Context 的问题;
做法:
组件模式下,每个Application 继承BaseApplication ,这样即使在组件模式下,也可以通过BaseApplication.getApplication()得到全局的context;
集成模式下,全局的MainApplication继承BaseApplication,也可以通过BaseApplication.getApplication()得到全局的context;
这样无论是组件模式下, 还是继承模式下,都可以通过BaseApplication.getApplication()得到全局的context;
public class BaseApplication extends Application {
//全局唯一的context
private static BaseApplication application;
@Override
public void onCreate() {
super.onCreate();
application = this;
ARouter.init(BaseApplication.getApplication());
}
public static BaseApplication getApplication() {
return application;
}
@Override
public void onTerminate() {
super.onTerminate();
ARouter.getInstance().destroy();
}
}
7.[踩坑]在项目的gradle.properties中配置
android.useAndroidX=true
android.enableJetifier=true
使应用对support库的依赖自动转换为androidx的依赖;
8.组件之间通信:ARouter框架(阿里)
1.框架的依赖
(1).在每个模块下的build.gradle中defaultConfig下添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
(2).在build.gradle的dependencies中添加
implementation 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
2.初始化ARouter
LogUtils代码
public class LogUtils {
public static boolean isDebug() {
boolean debuggable = false;
PackageManager pm = BaseApplication.getApplication().getPackageManager();
try{
ApplicationInfo appinfo = pm.getApplicationInfo(BaseApplication.getApplication().getPackageName(), 0);
debuggable = (0 != (appinfo.flags & ApplicationInfo.FLAG_DEBUGGABLE));
}catch(PackageManager.NameNotFoundException e){
}
return debuggable;
}
}
3.Activity的路径标记
module_main的OneActivity的路径标记/main/OneActivity
module_market的TwoActivity的路径标记/market/TwoActivity
注意:不同的模块下,第一个标记不能相同,否则报异常(隔离标记)
四、演示
1.集成模式
2.组件模式
壳app
module_main
module_market
好了,到此,组件化项目就完成了