Android路由框架Router分析
什么是路由?说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能。
路由框架的意义
1.在一些复杂的业务场景下,灵活性比较强,很多功能都是动态配置的,比如下发一个活动页面,我们事先并不知道具体的目标页面,但如果事先做了约定,提前做好页面映射,便可以自由配置。
2.随着业务量的增长,客户端必然随之膨胀,开发人员的工作量越来越大,比如64K问题,比如协作开发问题。App一般都会走向组件化的道路,而组件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系。
3.简化代码。数行跳转代码精简成一行代码。
4.其他...
特性
Router有哪些特性或者优点呢?
5.基于注解,使用方便,简洁
6.链式调用,api友好
7.多路径支持
8.结果回调,每次跳转都会回调跳转结果
9.编译期处理注解,不影响运行时性能
10.除了可以使用注解定义路由,还支持手动分配路由
11.自定义,可以对路由进行拦截,比如登录判断和埋点处理
12.自定义路由匹配规则,相比较其他路由框架,该项目并没有限制路由的写法,除了内置的几个匹配器,用户完全可以定义自己的规则
13.支持隐式Intent跳转
14.支持多模块使用,支持组件化开发
15.不仅支持注解Activity,还支持注解Fragment
16.支持Kotlin
其他功能正在添加中...
集成
router-gradle-plugin | router | router-compiler | |
最新版本 | [站外图片上传中……(3)] | ||
集成过程也可参考项目主页。
17.在项目级的adle中加入依赖:
注意,Router需要使用2.2.0及以上版本的Android gradle plugin来处理注解,截至写作时,最新版本为2.3.3
2.在module级的adle中使用plugin:
至此,集成工作就完成了,简单的两步:添加插件路径和应用插件。这应该是类似框架中最简单的集成方式了。
使用
18.Router需要初始化,用于初始化路由表,建议放到Application中做:
golang kotlin3.添加路由注解
3.发起路由操作
// 最简单的路由跳转,打开TestActivity Router.build("test").go(context); // 其他部分api Router.build("test") .requestCode(int) // 调用startActivityForResult .with(bundle) // 携带跳转参数 .addFlags(flag) // 添加标记,比如intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .anim(enter, exit) // 添加跳转动画 .callback(calback) // 跳转结果回调 .go(this);
全部可用API可参考接口。
4.startActivityForResult
Router.build(uri).requestCode(int).go(this); 其中requestCode一定得是一个非负数。
go(有如上几个重载方法,如果是在Fragment中发起startActivityForResult路由操作,切记传当前fragment实例哦!不然在fragment中是接受不到回调的。
5.添加跳转动画
// 1. 基础动画 Router.build(uri).anim(enter, exit).go(this); // 2. 转场动画ActivityOptions Router.build(uri).activityOptions(options).go(this);
6.获取目标页面
// 1. 获取intent,然后可以操作intent Intent intent = Router.build(uri).getIntent(context); // 2. 获取fragment,然后可以将该fragment添加到Activity中 Fragment fragment = (Fragment) Router.build(uri).getFragment(context);
7.全局
// 1. 添加全局 Router.addGlobalInterceptor(routeInterceptor); // 2. 跳过全局 Router.build(uri).skipInterceptors(.go(this);
8.添加
是Router的功能之一,作用就是在执行路由之前判断是否需要拦截该次路由请求。比如可以在中做登录状态判断。
9.自定义路由
除了可以使用注解来添加路由外(上面步骤2介绍的方式),还可以通过代码手动控制路由表。
该方式与注解没有冲突,可以同时使用。
10.路由匹配规则
该功能是Router最大的特功能,不同于其他框架,Router并没有规定路由的写法规则,而是抽象出Matcher的概念,交给用户去控制。但是Router仍然内置了4个常用的Matcher。
MatcherRegistry
匹配优先级从高到低依次是DirectMatcher、SchemeMatcher、ImplicitMatcher和BrowserMatcher,关于原理将在后序的原理篇中进行讲解。 假设有如下路由页面:
Matcher支持配置多个,会根据优先级依次进行匹配。
11.参数注入
•参数注入支持变量的默认值,目前支持默认值的变量类型有基本数据类型,String,CharSequence,其他类型的默认值都是null
•变量不建议使用private修饰符,因为私有的变量会采用反射的方式注入参数
•需要使用Router.injectParams(this)来实现最终的参数注入
Router还有其他一些人性化的小功能,在这里就不一一介绍了,有问题可以在项目主页提issue。后续会给大家讲解一下背后的实现原理。
总结
Router是一个十分小巧灵活的路由框架,代码设计也很优雅简洁,且完美支持组件化开发,目前仍在不断地迭代中,源码地址为,欢迎各位试用点评。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论