- 应用层:宿主工程,APP的主项目,APP入口和主架子
组件化Demo
==========================================================================
demo地址:点击此处,找管理员拿我根据demo项目从以下几个方面来讲解
-
1:项目分析
-
2:组件application和library动态切换
-
3:组件间的数据传递和方法调用
-
4:组件类(例如:Fragment)的获取,以及夸组件页面跳转和通讯
1:项目分析
如上图所示,项目的主要结构
-
应用层:app 项目的主入口
-
组件层:goods login 商品详情页和登录组件
-
基础库层:assemblebase用来各个组件数据和方法交互的 ,base是常用的工具类,各种类库的封装
2:组件application和library动态切换
在开发过程中,为了能够实现快速开发,组件能够独立运行就显的特别重要,moudle一般分为两种
-
App 插件,id: com.android.application
-
Library 插件,id: com.android.library
我们可以通过配置可动态进行application和library的切换,我们在各个组件的gradle.properties文件中配置一个控制切换的变量
然后在build.gradle中就可以通过isRunAlone变量来进行application和library的切换了,主要设计的点有三部分
-
plugin属性的配置
-
applicationId的配置
-
AndroidManifest的配置
if (isRunAlone.toBoolean()) {
apply plugin: ‘com.android.application’
} else {
apply plugin: ‘com.android.library’
}
android {
compileSdkVersion 26
defaultConfig {
if (isRunAlone.toBoolean()) {
applicationId “ppzh.jd.com.goods”
}
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName “1.0”
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
sourceSets {
main {
if (isRunAlone.toBoolean()) {
manifest.srcFile ‘src/main/manifest/AndroidManifest.xml’
} else {
manifest.srcFile ‘src/main/AndroidManifest.xml’
}
}
}
}
如果以上配置就可以实现application和library的切换了
3:组件间的数据传递和方法调用
由于主项目、组件之间,组件和组件之间不能直接通过引用进行数据传递和方法调用,那么在开发的过程中怎么进行数据传递和方法调用呢,可以通过「接口」+「实现」的方式进行,
assemblebase基础库就是用来进行数据传递和方法调用的,它被所有组件所依赖,assemblebase提供各个组件对外提供数据和方法调用的抽象service ,同时还有serviceFactory对service进行操作,各个组件在初始化的时候对各自的service进行实现。同时中也会提供所有的
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
Service 的空实现,以避免引起的空指针异常
就以登录模块为例,对外提供两个数据
public interface ILoginService {
boolean isLogin();
String getAccountId();
}
相关的serviceFactory类如下,可以通过serviceFactory拉取相关service的实例
public class ServiceFactory {
private ILoginService loginService;
private IGoodsService goodsService;
private ServiceFactory() {
}
public static ServiceFactory getInstance() {
return Inner.serviceFactory;
}
private static class Inner {
private static ServiceFactory serviceFactory = new ServiceFactory();
}
// ------------------------LoginService------------------------
public void setLoginService(ILoginService loginService) {
this.loginService = loginService;
}
public ILoginService getLoginService() {
if (loginService == null) {
loginService = new EmptyLoginService();
}
return loginService;
}
在login组件中只需要实现ILoginService,并通过serviceFactory进行设置
public class LoginService implements ILoginService {
@Override
public boolean isLogin() {
return false;
}
@Override
public String getAccountId() {
return null;
}
}
在login的appliction中进行service的设置
public class LoginApp extends baseApp {
@Override
public void onCreate() {
super.onCreate();
initModuleApp(this);
initModuleData(this);
}
@Override
public void initModuleApp(Application application) {
ServiceFactory.getInstance().setLoginService(new LoginService());
}
@Override
public void initModuleData(Application application) {
}
}
但是有这样一个问题:在集成到app中,LoginApp是没有被执行的,这个怎么解决呢,我们可以通过反射进行解决
public class AssembleApplication extends baseApp {
@Override
public void onCreate() {
super.onCreate();
initModuleApp(this);
initModuleData(this);
initComponentList();
}
@Override
public void initModuleApp(Application application) {
}
@Override
public void initModuleData(Application application) {
}
//初始化组件
//通过反射初始化
private void initComponentList(){
for (String moduleApp : AppConfig.moduleApps) {



