目录
4.2 APP 主工程 - AppCommonWorkObject
4.3 Modules 层 - XXXCommonResourcesObject
1. 问题
1. 实际开发中,一个APP 主工程依赖多个子 Modules的情况,此时由于单向依赖的存在,子 Modules 中的某些地方需要和APP/Modules 进行通信;
2. 由于技术上的单向依赖,尽管市面上也会有此类的通用第三方库来解决,但本着项目尽可能少的引入第三方和可持续性维护的原则,决定自己折腾一套;
2. 思路
1. 在APP 主工程中设定一个全局公共工作组对象(AppCommonWorkObject),单例模式;
2. 在各个子 Modules 中存在一个Modules 层公共资源对象(XXXCommonResourcesObject),单例模式;
3. Android Application 实例中,使用单例全局公共工作组对象(AppCommonWorkObject)维护注册一组Modules 层公共资源对象(XXXCommonResourcesObject);
4. 在各个子 Modules 中声明一个Modules 层全局通用接口(IXXXCallback),声明此处的一个空接口主要起到接口标签的作用,Modules 层的调用服用由公共资源对象(XXXCommonResourcesObject)来执行get/set 维护操作;
5. APP 层和各个子 Modules 层沟通和通信主要通过自己起用的一个概念:接口标签,来关联调用与执行;
具体的实现过程,如下图所示:
3. 目录
典型的目录结构如下所示,
-- APP 工程
-- common
-- AppCommonWorkObject
-- impl
-- XXXImpl
-- YYYImpl
-- ZZZImpl
...
-- Modules 工程
-- common
-- XXXCommonResourcesObject
-- callback
-- IXXXCallback
-- IXXXZYXCallback
4. 代码
4.1 APP 主工程 - 初始化调用
AppCommonWorkObject.getInstance().setXXXCallback(new XXXImpl());
4.2 APP 主工程 - AppCommonWorkObject
public class AppCommonWorkObject {
private static final AppCommonWorkObject INSTANCE = new AppCommonWorkObject();
public static AppCommonWorkObject getInstance() {
return INSTANCE;
}
private AppCommonWorkObject() {
}
protected IXXXCallback callback; // Modules 层ICallback,建议为超级接口(接口标签)
public IXXXCallback getXXXCallback() {
return callback;
}
public void setXXXCallback(IXXXCallback callback) {
this.callback = callback;
if (null != callback) {
//noinspection ConstantConditions
if (callback instanceof IXXXCallback) { // 具体接口 IXXXCallback
XXXCommonResourcesObject.getInstance().setXXXCallback(callback);
} else if(callback instanceof IXXXZYXCallback) { // 具体接口 IXXXZYXCallback
// XXXCommonResourcesObject.getInstance().setXXXCallback(callback);
} else {
// nothing to do
}
}
}
}
4.3 Modules 层 - XXXCommonResourcesObject
public class XXXCommonResourcesObject {
private static final XXXCommonResourcesObject INSTANCE = new XXXCommonResourcesObject();
public static XXXCommonResourcesObject getInstance() {
return INSTANCE;
}
private XXXCommonResourcesObject() {
}
protected IXXXCallback callback;
public IXXXCallback getCallback() {
return callback;
}
public void setCallback(IXXXCallback callback) {
this.callback = callback;
}
}
此时各个层使用各个业务层对象:
1. APP 主工程使用实现了IXXXCallback 接口的XXXImpl 对象;
2. Modules 层使用XXXCommonResourcesObject 进行IXXXCallback 伪代码调用即可;
这个只是自己临时解决上线问题所想出来的一个简单办法,如有更好的想法,欢迎一块讨论交流技术;