美文网首页Android开发经验谈Android开发Android技术知识
Android组件化专题 - 路由框架进阶模块间的业务通信

Android组件化专题 - 路由框架进阶模块间的业务通信

作者: 289346a467da | 来源:发表于2018-07-12 23:35 被阅读130次

    上一篇文章,讲解了路由框架实现的原理,并实现了基本的路由框架 页面路由的跳转
    Android组件化专题 - 路由框架原理

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

    代码地址

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

    app --> module1 module1 --> module2
    image.png image.png

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


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

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

    模块间的业务通信

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

    看下图设计思路:

    image.png

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

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

    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");
    

    运行效果如下图所示:

    image.png

    Android的组件化专题:
    组件化配置

    APT实战

    路由框架原理

    模块间的业务通信

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

    相关文章

      网友评论

        本文标题:Android组件化专题 - 路由框架进阶模块间的业务通信

        本文链接:https://www.haomeiwen.com/subject/noedpftx.html