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

微信公众号:Android研究院 关注可了解更多的Android知识,专注于移动领域,不知代码还有人生的哲学。 问题或建议,请公众号留言; 如果你觉得文章对你有帮助,欢迎赞赏[1]

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

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

代码地址

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

app --> module1

module1 --> module2

image.png

image.png

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

image.png

  1. 通过注解 Activity 类,注解处理器处理注解(APT)动态生成路由信息。
  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");

运行效果如下图所示:

image.png

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

APT实战

路由框架原理

模块间的业务通信

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

原文发布于微信公众号 - Android研究院(androidlinksu)

原文发表时间:2018-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程思想之路

Android中应用调用系统权限

现在设备的安全性越来越受到重视,随之而来的便是开发中的各种不便,比如有普通权限,运行时权限,系统权限之分。对于运行时权限的添加可以参考 对于Android中各个...

31660
来自专栏向治洪

百度地图开发1

最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的A...

32970
来自专栏青蛙要fly的专栏

超详细的生命周期图-你能回答全吗

超详细的Activity与Fragment的生命周期图,可能大家会说你这篇文章也太水了吧。就这么一个破图。可是我觉得它写的很详细,有些方法是哪些情况下会运行,哪...

11520
来自专栏Android先生

(新瓶旧酒)谷歌官方MVP项目学习--浅入源码

项目的目的是通过展示各种架构app的不同方式来帮助开发者解决架构问题。项目中通过不同的架构概念及方式实现了功能相同的app。你可以用示例来当做参考,或是干脆拿来...

13610
来自专栏分享达人秀

ListView列表数据源——Adapter

在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter。 一、了解MVC模式 在开始学习...

443100
来自专栏刘望舒

Android架构(一)MVP全解析

前言 关于架构的文章,博主很早就想写了,虽说最近比较流行MVVM,但是MVP以及MVC也没有过时之说,最主要还是要根据业务来选择合适的架构。当然现在写MVP的文...

226100
来自专栏IT大咖说

Oracle中最容易被忽略的那些实用特性

内容来源:2017 年 04 月 08 日,ITPUB管理版版主吕海波在“DBGeeK+PG数据库技术沙龙(4月杭州站)”进行《Oracle中最容易被忽略的那些...

15460
来自专栏Android开发指南

14.极光推送

476110
来自专栏Java呓语

Tips·检测应用程序被卸载

我们知道广播ACTION_PACKAGE_REMOVED可以监听应用程序卸载,但不幸的是这个意图被卸载的程序是不可知的,所以无法监听到自己的程序被卸载。

16330
来自专栏Android先生

Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法

即 需要2个步骤 才可 完成 一键退出 App 需求。下面,我将根据这两个步骤进行功能实现讲解。

8820

扫码关注云+社区

领取腾讯云代金券