最近一直在忙着把项目进行模块化,组件化,记录一下在进行模块化过程中遇到的问题。
项目模块化,按什么来分module比较合理?
我的做法比较粗暴,直接按功能分。比如,几乎每个项目都有 设置功能,登陆功能等。
app SettingModule LoginModule
有一些可能使用领域模型来区分模块。很难定义出一个标准的区分模块,就好像项目分包一样,每一个都会有自己的一套。自己觉得方便就好。
Module 与 Module 之间的跳转了?
模块化之后 Ma 和 Mb 之间是不存在依赖关系的,就存在了但Ma 需要 跳转到Mb的某个Activity(或者Mb 跳转到Ma的某个Activity)问题?
使用Event Bus 通信?EventBus的单Module通信的
使用Boardcast?系统广播效率低,但前面的广播阻塞,下一个广播将无法接收
我的做法是
虽然Ma 和 Mb 自己不存在直接依赖的关系,但存在间接依赖,每个Module都依赖BaseModule
后来发现阿里开源来一个ARouter框架,使用起来更方便。
详情看ARouter官网
Application合并
主工程有一个Application,当次级Module也有Application,运行程序会报错,一个工程只能有一个Application。然而当次级Module也需要加载时初始化一些数据怎么办?
可以使用接口抽象的思想。
每个module都会依赖于base module 。
在base module 创建接口 IModule
让需要初始化的Module实现该接口
然后在Application的oncreate方法通过反射统一加载
base Module
public interface IModule {
void onLoad(Application app);
}
Ma
public class LoginModule implements IModule {
@Override
public void onLoad(Application app) {
Timber.tag("LoginModule").d("-------> LoginModule ");
}
}
MB
public class SettingModule implements IModule {
@Override
public void onLoad(Application app) {
Timber.tag("SettingModule").d("-------> SettingModule ");
}
}
主工程
for(String name : ModuleConfig.moduleList){
try {
Class<?> clazz = Class.forName(name);
Object instance = clazz.newInstance();
if(clazz.newInstance() instanceof IModule){
Method method = clazz.getDeclaredMethod("onLoad", Application.class);
method.invoke(instance,this);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
Timber.tag(TAG).d("----- time = " +(System.currentTimeMillis() - l));
反射会损耗性能,对比一下时间,其实没相差多少。
Menifest合并,资源合并
重复的权限,colors、drawable会合并