阿里巴巴ARouter原理分析关于注解和跳转

关于@Route注解

阿里巴巴开源的路由框架:https://github.com/alibaba/ARouter

先说一下,组件化中使用intent依然可以实现跳转,但是仅限于本module

不同moule之间跳转需要设置大量的tag标记,浪费资源

先说下组件化:
组件化是最近比较流行的架构设计方案,它能对代码进行高度的解耦、模块分离等,极大地提高开发效率

路由和组件化本身没有什么联系,因为路由的责任是负责页面跳转,但是组件化中两个单向依赖的module之间需要互相启动对方的Activity,因为没有相互引用,startActivity()是实现不了的,

在需要对其他module提供调用的Activity中,都需要声明@Route注解,我们称之为路由地址。

@Route(path = “/userCenter/login”)
public class MyClass {…}

路由框架会在项目的编译期通过注解处理器扫描所有@Route注解的Activity类,然后将Route注解中的path地址和Activity.class文件的映射关系保存到它自己生成的java文件的map中。

public class MyRouters {

    //项目编译后通过apt生成如下方法

    public static HashMap<String, ClassBean> getRouteInfo(HashMap<String, ClassBean> routes) {

        route.put("/userCenter/login", LoginActivity.class);

        route.put("/userCenter/register”, RegisterActivity.class);
    }
}

ARouter路由跳转的实现

  1. //用ARouter启动Activity,代码如下:
  2.         ARouter.getInstance().build("/userCenter/login").navigation();
    
  3. public void login(String name, String password) {
    
  4.     HashMap<String, ClassBean> route = MyRouters.getRouteInfo(new HashMap<String, ClassBean>);
    
  5.     LoginActivity.class classBean = route.get("/userCenter/login");
    
  6.     Intent intent = new Intent(this, classBean);
    
  7.     intent.putExtra("name", name);
    
  8.     intent.putExtra("password", password);
    
  9.     startActivity(intent);
    
  10. }

路由框架在这个时期根据注解@Route去扫描所有文件,然后生成路由映射文件(path和activity.class)。这些文件都会统一打包到apk里。
apt生成的路由映射关系文件,在项目编译后会在各个模块的/build/generated/source/apt文件夹下面生成。

总结:

1.编译期
路由框架在这个时期根据注解@Route去扫描所有文件,然后生成路由映射文件(path和activity.class)。这些文件都会统一打包到apk里。
apt生成的路由映射关系文件,在项目编译后会在各个模块的/build/generated/source/apt文件夹下面生成。

2.运行期:
使用路由跳转之前需要获取路由映射关系并保存到内存中。那么获取路由关系最好的时机就是应用程序初始化的时候,也就是我们的ARouter.init()方法;它会加载我们在编译时期生成的路由映射关系文件,获取映射关系保存到内存(map)中。

3.页面跳转
进行路由跳转的时候,通过build()方法传入目标页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class(activity.class = map.get(path)),然后new Intent(context, activity.Class),当调用ARouter的withString()方法它的内部会调用intent.putExtra(String name, String value),调用navigation()方法,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。

补充:

1:组件化中模块之间的Activity跳转,为什么选择ARouter路由跳转
1):隐式跳转,但是一个项目中不可能所有的跳转都是隐式的,这样Manifest文件会有很多过滤配置,而且非常不利于后期维护。
2):反射拿到Activity的class文件也可以实现跳转,
缺点:1大量的使用反射跳转对性能会有影响,
2.需要拿到Activity的类文件,在组件开发的时候,想拿到其他module的类文件是很麻烦的,因为组件开发的时候组件module之间是没有相互引用的,你只能通过找到类的路径去反射拿到这个class。

2:什么是APT
APT是Annotation Processing Tool的简称,即注解处理工具。apt是在编译期对代码中指定的注解进行解析,然后做一些其他处理(如通过javapoet生成新的Java文件)。我们常用的ButterKnife,其原理就是通过注解处理器在编译期扫描代码中加入的@BindView、@OnClick等注解进行扫描处理,然后生成XXX_ViewBinding类,实现了view的绑定。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值