ARouter 是阿里巴巴开源的一个Android页面路由框架,它提供了url跳转、自动解析bundle数据赋值,自定义拦截跳转过程,url调用接口服务等功能
下面我们来了解下ARouter 框架的使用
框架配置与初始化
gradle 版本 >= 2.2 的配置方法(使用annotationProcessor):
1 | android { |
gradle 版本 < 2.2 的配置方法(使用apt):
1 | apply plugin: 'com.neenbedankt.android-apt' |
在Application中初始化ARouter:
1 | public class MyApplication extends Application { |
Activity基础跳转
在Activity声明注解Route,并赋予path值(即url),值得注意的是path必须至少有两级目录,否则会在编译期报错:
1 | "/arouterTest/activities/jumpTestActivity") (path = |
然后调用ARouter的build方法输入url,调用navigation方法即可打开对应的Activity:
1 | ARouter.getInstance().build("/arouterTest/activities/jumpTestActivity").navigation(); |
也可以传入uri进行跳转:
1 | Uri testUri = Uri.parse("test://test.com/arouterTest/activities/jumpTestActivity"); |
需要接收ActivityResult的可以在navigation中传入requestCode:
1 | ARouter.getInstance().build("/arouterTest/activities/jumpTestActivity").navigation(this, 666); |
传递参数与参数注入
传递参数调用ARouter的with系列方法即可:
- with各种基本类型
- withObject
- withParcelable
- with:直接传递Bundle参数
例,传入名为text的字符串参数:
1 | ARouter.getInstance().build("/arouterTest/activities/jumpTestActivity") |
参数注入,即在目标Activity中自动解析传入的参数:
首先我们需要使用Autowired注解,并且把注解标记的属性设置为public的:
1 | "text") (name = |
然后调用ARoute的inject方法即可:
1 | ARouter.getInstance().inject(this); |
使用新旧转场动画处理跳转
旧动画:
使用withTransition方法即可:
1 | ARouter.getInstance().build(testUri).withTransition(R.anim.slide_in, R.anim.slide_out) |
新动画:
使用withOptionsCompat方法即可:
1 | ActivityOptionsCompat compat = ActivityOptionsCompat. |
kotlin跳转
与Java相似,声明Route注解并为path属性赋值:
1 | @Route(path = "/kotlin/test") |
然后跳转即可:
1 | ARouter.getInstance() |
接口调用
除了跳转Activity外,ARouter还允许用户进行接口调用
首先我们需要新建接口,我们的接口需要继承IProvider接口:
1 | public interface MyServiceInterface extends IProvider { |
接着实现这个接口:
1 | "/interface/my-service") (path = |
我们可以在init方法中进行一些接口首次被调用时的初始化操作。
调用接口的方式有几种:
使用url调用接口:
1 | ((MyServiceInterface) ARouter.getInstance().build("/interface/my-service").navigation()) |
通过类型(.class)来调用接口:
1 | ARouter.getInstance().navigation(MyServiceImpl.class).doSomething(); |
获取Fragment
ARouter还允许我们获取某个Fragment:
使用Route注解声明:
1 | "/test/fragment") (path = |
通过url获取:
1 | Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation(); |
跨模块调用
ARouter的调用除了能在本module中运行外,也可以跨module运行,由于代码类似,在此不多研究
处理跳转结果
ARouter可以让我们处理跳转过程的结果:
1 | ARouter.getInstance().build("/module/jumpTestActivity2").navigation(null, |
拦截器
ARouter的拦截器可以在navigation的过程中拦截请求,并进行一系列的处理,是一种AOP的编程模式(应用场景为检查登录状态等)
要实现拦截器,首先我们需要实现IInterceptor接口,并使用Interceptor注解标记我们的拦截器,并传入priority优先级参数(数字越小、优先级越高)
例子:这里实现了两个拦截器:
1 | 6) (priority = |
IInterceptor接口定义了两个方法:
- init方法:在ARouter初始化的时候会调用,用于进行一系列初始化操作
- process方法:拦截请求的处理方法,分别传入Postcard(请求的具体信息),InterceptorCallback(用于控制拦截流程)两个参数
这里说一下InterceptorCallback这个参数,这个接口定义了两个方法:
- onContinue:传入Postcard参数(可以更改请求参数),表示当前拦截器放行此请求(该请求可以被更低优先级的拦截器拦截,或者没有拦截器了就执行对应操作)
- onInterrupt:拦截此次请求,不再传递下去
- 如果不调用任何方法则默认拦截此次请求
因此,上面例子中的拦截器实现的效果是,分别执行MyInterceptorFirst、MyInterceptorSecond拦截器,并拦截请求,无法跳转
以上就是本人探究的ARouter的功能,如有遗漏欢迎补充~