博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android组件化专题 - 路由框架进阶模块间的业务通信
阅读量:6936 次
发布时间:2019-06-27

本文共 3875 字,大约阅读时间需要 12 分钟。

上一篇文章,讲解了路由框架实现的原理,并实现了基本的路由框架 页面路由的跳转 。

本篇文章来对基础的路由框架进阶,来实现模块间的业务通信功能。

我们来看以下实现的效果图:

app --> module1 module1 --> module2

首先我们先回顾,路由框架的设计思路,如下图:

  1. 通过注解 Activity 类,注解处理器处理注解()动态生成路由信息。
  2. 收集路由:通过定义的包名,找到所有动态生成的类,将路由信息存储到本地仓库 (rootMap).
  3. 页面跳转:根据注解的路由地址,从本地仓库中找到相关的路由信息,获取到要跳转的类,然后实现跳转。

路由框架的实现思路很容易理解,建议手撸一遍,基本掌握这种实现思路。

模块间的业务通信

如何在路由框架的基础上扩展模块间的业务通信呢?

看下图设计思路:

只要弄懂了路由框架的原理,模块间的业务通信就很容易实现了。

我们继续在上一遍文章的扩展。

  1. 修改primrouter-compiler 包中的 RouterProcessor 类 在之前只有Activity类的基础上,加上一个Service类型
//获得Activity的类型        TypeElement activity = elementUtils.getTypeElement(Consts.Activity);        //获取Service的类型        TypeElement service = elementUtils.getTypeElement(Consts.Service);//只能指定的类上面使用            if (typeUtils.isSubtype(typeMirror, activity.asType())) {                //存储路由相关的信息                routerMeta = new RouterMeta(RouterMeta.Type.ACTIVITY, annotation, element);            } else if (typeUtils.isSubtype(typeMirror, service.asType())) {                //存储路由相关的信息                routerMeta = new RouterMeta(RouterMeta.Type.SERVICE, annotation, element);            } else {                throw new RuntimeException("Just Support Activity Router!");            }复制代码

Service 类是在primrouter-core 核心库中的一个接口类

public static final String Service = "com.primrouter_core.interfaces.IService";复制代码

这个空接口,就是为了实现业务间的通信

public interface IService {}复制代码
  1. 修改primrouter-core 库中的PrimRouter 类

在生成跳卡的方法中扩展如下代码,实际上就是将IService 的具体实现存到JumpCard 中去。

private void produceJumpCard(JumpCard card){   if{    ........    } else {            //设置要跳转的类            card.setDestination(routerMeta.getDestination());            //设置要跳转的类型            card.setType(routerMeta.getType());            switch (routerMeta.getType()) {                case SERVICE:                    Class
destination = routerMeta.getDestination(); IService iService = Depository.serviceMap.get(destination); if (iService == null) { iService = (IService) destination.getConstructor().newInstance(); Depository.serviceMap.put(destination, iService); } card.setService(iService); break; default: break; } }}复制代码

然后直接返回IService 转换成 IService 的子类。

public Object navigation(Context context, final JumpCard jumpCard, final int requestCode, Object o1) { .......... .......... ..........case SERVICE:                Log.e(TAG, "navigation: " + jumpCard.getService());                return jumpCard.getService();                }复制代码
  1. 修改base库,base 库是所有模块都必须引入的基础库

extends IService

public interface TestService extends IService {    void test(Context context,String s);}复制代码

然后哪个模块需要TestService业务逻辑,就实现具体的TestService,并注解@Router(path),

app:

@Router(path = "/app/service")public class AppService implements TestService {    @Override    public void test(Context context, String s) {        Toast.makeText(context, "我是app,我是被:" + s + "模块调用的,模块间通信测试成功", Toast.LENGTH_SHORT).show();    }}复制代码

module1:

@Router(path = "/module1/service")public class Module1Service implements TestService {    private static final String TAG = "Module1Service";    @Override    public void test(Context context, String s) {        Toast.makeText(context, "我是Module1,我是被:" + s + "模块调用的,模块测试通信成功", Toast.LENGTH_SHORT).show();    }}复制代码

module2:

@Router(path = "/module2/service")public class Module2Service implements TestService {    @Override    public void test(Context context, String s) {        Toast.makeText(context, "我是Module2,我是被:" + s + "模块调用的,模块测试通信成功", Toast.LENGTH_SHORT).show();    }}复制代码

调用方式: 可以在任意模块调用

TestService testService = (TestService) PrimRouter.getInstance().jump("/module1/service").navigation();testService.test(this, "app");复制代码

运行效果如下图所示:

Android的组件化专题:

下一篇:Activity跳转参数自动注入和Fragment的跳转。

转载于:https://juejin.im/post/5c1b21f7e51d455ac91d6914

你可能感兴趣的文章
如何利用altera 给出的megafunction配置成自己想要的FIFO和RAM ——本文为转载
查看>>
熟悉常用的Linux操作
查看>>
如何用java实现数据脱敏
查看>>
html5 本地存储有多少种方案:
查看>>
Access-Control-Max-Age是什么?
查看>>
Extjs文件上传问题总结
查看>>
C# 导出Excel的示例(转)
查看>>
NUC1014 排版题.输出排列成菱形的字母
查看>>
利用反射机制获取属性的值遇到的坑
查看>>
最新app源码下载:200款优秀Android项目源码
查看>>
PHP/Yii2操作Cookie,常见问题以及注意事项
查看>>
支持向量机(五)SMO算法
查看>>
编译Android源码
查看>>
聚类分析算法---学习
查看>>
通过SQL Server命令行启动及停止SQL服务的方法
查看>>
笔记本电脑不显示电量图标-20180103
查看>>
JVM致命错误日志(hs_err_pid.log)解读
查看>>
springboot~openfeign从此和httpClient说再见
查看>>
CSRF攻击和防护
查看>>
FileUpload控件实例应用 上传文件
查看>>