1 项目整体结构
构建拥有不同模块的项目时,可使用阿里的Arouter进行模块间通讯,先来看看模块间整体的引用如下:
所有通讯接口皆由Service Library提供,如果是子模块向主模块获取或设置数据,则由主模块实现接口做具体业务逻辑的编写,子模块进行调用。
反之,则由子模块编写具体实现的业务逻辑代码,主模块进行调用。
2 基本介绍
当项目分成不同模块时,可以采用Arouter
进行模块间的通讯,具体如何进行模块间通讯,详细的使用方法暂时不在这篇文章的讨论范围,具体可参考官方文档。
简单说一下使用,模块间跳转可通过如下方法:
ARouter.getInstance().build("/module_mall/my_points_activity").navigation();
在某个类上加上@Route
注解就可以进行跳转了:
@Route(path = "/module_mall/my_points_activity")
public class MyPointsActivity
模块间数据传递:
- 第一步,让
service
模块中的传递类继承IProvider
接口。
public interface MallService extends IProvider {
// ...省略无关代码...
}
- 第二步,定义子模块中相对应的实现类,并且加上
@Route
注解。
@Route(path = Constant.ROUTER_MALL_SERVICE)
public class MallServiceImpl implements MallService {
// ...省略无关代码...
}
- 第三步,调用实现类。
MallService mallService = (MallService) ARouter.getInstance()
.build(Constant.ROUTER_MALL_SERVICE)
.navigation();
3 遇到问题
我们先来考虑一个这样的场景,如果某个应用有A,B两个模块,A为主模块,B为子模块。某个时刻,应用程序处于B模块的一个页面上,这时接收到push通知,那么我们的消息如何传递到相应的子模块呢?
思路就是:获取当前所在的activity,然后通过包名判断处于哪个模块。
直接上代码:
private void handleMessage(PushData pushData) {
// 获取当前栈顶元素
Activity activity = ActivityCollector.getTopActivity();
// 当前activity属于主模块,AppBaseActivity为主模块的基类activity
if (activity instanceof AppBaseActivity) {
/* 当前模块自己处理 */
AppBaseActivity appBaseActivity = (AppBaseActivity) activity;
appBaseActivity.handlePushMessage(pushData);
} else {
/* 子模块处理 */
submoduleHandleMessage(pushData, activity);
}
}
如果当前处于其他模块的activity,通过包名对应相应的模块。
private void submoduleHandleMessage(PushData pushData, Activity activity) {
String className = activity.getLocalClassName();
String strs[] = className.split("\\.");
String packageName = strs[0] + "." + strs[1] + "." + strs[2] + "." + strs[3];
switch (packageName) {
case "com.hotelgg.android.malllibrary":
MallService mallService = (MallService) ARouter.getInstance().build(Constant.ROUTER_MALL_SERVICE).navigation();
mallService.handlePushMessage(pushData);
break;
case "com.hotelgg.android.paylibrary":
PayService payService = (PayService) ARouter.getInstance().build(Constant.ROUTER_PAY_SERVICE).navigation();
payService.handlePushMessage(pushData);
break;
}
}