重构篇 — ARouter模块间通讯

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;

    }
}

你可能感兴趣的:(重构篇 — ARouter模块间通讯)