组件化框架设计之阿里巴巴开源路由框架——ARouter原理分析(一)

本文介绍了阿里巴巴的ARouter路由框架,用于解决模块化开发中组件间的通信问题。ARouter基于反射和注解实现,通过在类名上添加@Route注解来标记可被其他模块找到的路径。初始化过程中,ARouter收集所有注解信息并存储在静态Map中,方便后续查找。Activity的跳转通过反射调用startActivity方法,而Provider则返回类的实例。拦截器和自动注入等功能未在本文中详述。
摘要由CSDN通过智能技术生成

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

背景

当项目的业务越来越复杂,业务线越来越多的时候,就需要按照业务线去分不同的模块去开发,这样专门的人负责专门的业务模块,最终上线由壳工程去负责进行组合打包各个module,完成业务的快速迭代。整个过程会涉及到各个模块间进行通信,比如订单模块和个人中心模块,可能会需要频繁的传递数据和页面跳转,这个时候怎么去处理呢?我们能想到的方案就是采用类名反射,来动态创建需要跳转和交互的类,这样编译时就不会报错,运行时又可以完成模块间的交互。阿里巴巴推出的开源路由框架——ARouter就是基于反射和注解来解决这个问题的,本文不讲基本使用(基本使用在项目的github主页上已经将的非常详细了),通过分析整个路由过程来讲解它的基本原理。

说在前面

首先在我们需要用到的类的类名加上注解@Route(“/group/name”),注意这里需要至少两层路径(第一个是分组,第二个一般是类名)。这个注解就是代表这个类可以被其他模块找到的一个路径的注解,并且它是一个编译时注解,这就意味着在编译时就已经生成了相应的辅助类。ARouter把路由一共分为以下几类:

ACTIVITY(0, “android.app.Activity”), 
SERVICE(1, “android.app.Service”), 
PROVIDER(2, “com.alibaba.android.arouter.facade.template.IProvider”), 
CONTENT_PROVIDER(-1, “android.app.ContentProvider”), 
BOARDCAST(-1, “”), 
METHOD(-1, “”), 
FRAGMENT(-1, “android.app.Fragment”), 
UNKNOWN(-1, “Unknown route type”);

其中我们常用的就是ACTIVITY,PROVIDER,FRAGMENT这三个了,也基本上满足了我们模块化开发的需求。另外一点就是分组的概念,ARouter是按照组来进行整理的,也就是第一层的路径,所以前面说必须要两层路径,否则不知道归到哪里去,一般一个module按照模块名采用统一的分组标识。我们来看看注解生成的类(这里只包含了Activity,Fragment,Provider):

package com.alibaba.android.arouter.routes;
//。。。import省略
/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Group$$Personal implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/Personal/EARNING", RouteMeta.build(RouteType.ACTIVITY, PerEarningActivity.class, "/personal/earning", "personal", null, -1, -2147483648));
    //...省略Activity,Fragment
    atlas.put("/Personal/main", RouteMeta.build(RouteType.FRAGMENT, PerMainFragment.class, "/personal/main", "personal", null, -1, -2147483648));
    atlas.put("/Personal/service", RouteMeta.build(RouteType.PROVIDER, PerServiceImpl.class, "/personal/service", "personal", null, -1, -2147483648));
  }
}

以上就是所有注解的路径的信息集合,包含了所有的Activity,Fragment,Provider(一般一个module一个Provider就够用了,专门用来跟其他模块交互),并都以路径为key放到这个map中。

package com.alibaba.android.arouter.routes;
//。。。import省略
/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Providers$$modlue_personal implements IProviderGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> providers) {
    providers.put("com.tb.test.service.ModulePersonalService", RouteMeta.build(RouteType.PROVIDER, PerServiceImpl.class, "/Personal/service", "personal", null, -1, -2147483648));
  }
}

这个类是专门的Provider的索引的集合,所有的provider都被以全类名为索引放到一个map中。

package com.alibaba.android.arouter.routes;
//。。。import省略

/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Root$$modlue_personal implements IRouteRoot {
  @Override
  public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) {
    routes.put("Personal", ARouter$$Group$$Personal.class);
  }
}

这个类是所有的group的信息收集,全部都以group的名字为key,以注解生成的不同的group的类的c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值