1 .组件间的application合并规则
- 功能module有自定义Application,主module没有自定义Application,打包会引用功能模块module的自定义Application
- 主module有自定义Application ,其他module没有,则打包的时引入主module的Application
- 功能module有多个Appcation,每个module 添加 tool:replace = "android:name",会打包最后编译module的Application
- 主module有自定义Application,其他功能module也有自定义Application,在主module 中添加replace = "android:name"
,打包编译是主module 的Application
2. 组件间的通信
本地广播
优点
- 只在app内广播
- 比全局更加高效
缺点
使用繁琐
EventBus
优点
- 简化组件间通信方式
- 实现解耦
- 动态设置事件处理线程和优先级
缺点
每个事件都定义一个事件类,造成事件类太多,维护成本增加
3. 组件间的跳转
ARouter
优点
- 组件跳转
- 自定义拦截器
- 提供Ioc容器
- 降级策略
4. 相互调用
由于主项目与组件,组件与组件之间都是不可以直接使用类的相互引用来进行数据传递的,那么在开发过程中如果有组件间的数据传递时应该如何解决呢,这里我们可以采用 [接口 + 实现] 的方式来解决。
在这里可以添加一个 ComponentBase 模块,这个模块被所有的组件依赖,在这个模块中分别添加定义了组件可以对外提供访问自身数据的抽象方法的 Service。ComponentBase 中还提供了一个 ServiceFactory,每个组件中都要提供一个类实现自己对应的 Service 中的抽象方法。在组件加载后,需要创建一个实现类的对象,然后将实现了 Service 的类的对象添加到 ServiceFactory 中。这样在不同组件交互时就可以通过 ServiceFactory 获取想要调用的组件的接口实现,然后调用其中的特定方法就可以实现组件间的数据传递与方法调用。
当然,ServiceFactory 中也会提供所有的 Service 的空实现,在组件单独调试或部分集成调试时避免出现由于实现类对象为空引起的空指针异常。
5. 组件初始化
Base module定义接口BaseAppInit
public interface BaseAppInit{
void onInit(Application app)
}
其他module实现BaseAppInit
public class ModuleA implements BaseInit{
public void onInit(Application app){
//执行初始化操作
}
}
在主module Application 里面执行初始化
通过反射,初始化各个组件的 Application。
6. 组件化资源
依赖包冲突
gradle 打包时默认使用版本比较高的依赖
如果想使用比较低的版本,使用exclude排除依赖
资源名冲突
如果有字段名一样的,后编译的模块会覆盖之前编译的内容
- 命名规范
- gradle 添加 resourcePrefix字段
网友评论