首页 > 编程知识 正文

arouter使用,AROUTER 传递list

时间:2023-05-04 03:51:33 阅读:227984 作者:2472

Arouter 组件化组件模块模块开发的好处注意 Arouter路由APT添加注解初始化跳转

组件化

将共用的代码提取出来作为base模块,并根据业务来将整个项目划分为module。

组件

指的是单一功能的组件,如视频组件、支付组件、路由组件等,每个组件都能单独抽出来做成SDK。

模块

指的是独立的业务模块,如直播模块、首页模块等。模块相对于组件粒度更大,模块可能包含不同的组件。

模块开发的好处 业务模块解耦各个模块间可以并行开发和测试单独业务模块可以单独编译打包,提高了编译速度多个app共用模块,降低了开发和维护成本。 注意

组件化和模块化本质思想是一样的,都是为了代码重用和解耦。区别在于模块化是业务为导向,而组件化是功能为导向。

Arouter 路由

首先组件化一般都是不同的module,他们都依赖于一个base_module。这样的话由于我们每个module之间相互独立,导致他们都无法方便进行通信。

但是我们就可以在module和base_module之间添加一个路由模块,让这个路由模块来管理他们之间的路由就可以了。

实现原理也很简单,就是在路由模块里面就存在一个HashMap,HashMap中保存着路由的路径(String)和对应的Activity的class(Class),这样如果我们想要从Amodule中的AActivity跳转到Bmodule中的BActivity的话,就直接从HashMap中根据跳转的路由信息String取出对应的Activity,r然后根据参数构造Intent,并通过Handler切换为主线程,在主线程中进行startActivity然后就进行跳转即可。

(这块的核心就是只要能拿到那个Class,就能跳转。那么为什么组件间不能直接通过Class跳转?其实是可以的,但是难点在于你在代码中没法拿到对应的Activity的Class对象)

APT

简单点可以参考Retrofit中的注解原理、或者EventBus中的注解原理。

那么ARouter背后的原理是怎么样的呢?

实际上它的核心思想跟上面讲解的是一样的,我们在代码里加入的@Route注解,会在编译时期通过apt生成一些存储path和activityClass映射关系的类文件,然后app进程启动的时候会拿到这些类文件,把保存这些映射关系的数据读到内存里(保存在map里),然后在进行路由跳转的时候,通过build()方法传入要到达页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class(activity.class = map.get(path)),然后new Intent(),当调用ARouter的withString()方法它的内部会调用intent.putExtra(String name, String value),调用navigation()方法,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。

添加注解

在使用ARouter的时候,你首先先得给你需要跳转的Activity或者Fragment等类的前面添加注解,注明他的路径。添加注解的时候,ARouter就会根据你添加的注解通过APT自动生成对应的三个类:Group、Providers、Root。这三个类里面就存着当前这个module中你设置的路径的组、具体路径以及Rrovider的路径。

初始化

jmdmy调用ARouter的init方法时,他就会有一个类叫Warehouse,这个类里面只有3组也就是6个静态类型的Map,对应着我们刚刚说的APT自动生成的那三个类,分别是route的map、provider的map以及拦截器Interceptor的map。

然后init就会拿到所有配置了route的类,按照不同的属性分别加到三个map里面去。

调用init方法后会调用_ARouter的afterinit方法,这个方法最后会返回一个根据path和group来new好的一个Postcard对象,这个Postcard就是用来存放跳转所需信息,也就是说我们在通过ARouter传值的时候,设定的值都先放在这个Postcard里面。

跳转

然后当我们需要跳转的时候,实际上调用的是_ARouter的_navigation方法,在这个方法中就会new一个intent,然后把postcard中存储的activity传进去,接着如果你配置了Extra,就会调用intent的putExtra方法把postcard中的Extra给传进去,同样的,如果你设置了Flag也是把postcard的Flag传给intent,action也是从postcard传给intent。等extra、flag、action都配置好了之后,就通过runInMainThread回到主线程然后调用startActivity跳转过去。

其中runInMainThread是通过得到主线程的Looper,再判断当前线程是不是主线程,如果不是就通过handler发消息,如果是就直接run。startActivity也是_ARouter自己的方法,基本上都是通过ActivityCompat调用startActivityForResult或者startActivity进行跳转。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。