当前位置: 首页 > news >正文

android 路由表参数,Android点我达路由DRouter框架设计与解析

为什么要路由

什么是路由?说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能。Android系统已经给我们提供了api来做页面跳转,比如startActivity,为什么还需要路由框架呢?我们来简单分析下路由框架存在的意义:

在一些业务场景下,灵活性比较强,很多功能都是运营人员动态配置的,比如下发一个活动页面,我们事先并不知道具体的目标页面,但如果事先做了约定,提前做好页面映射,便可以自由配置。

随着业务量的增长,项目越来越庞大,开发人员越来越多,App一般都会走向组件化、插件化的道路;而组件化、插件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系。

极大简化代码。数行跳转代码可以精简成一行代码。

因此我们设计了一个路由框架我们命名为DRouter。总的来说,DRouter设计追求的是功能模块的解耦,能够实现基本路由功能,以及开发者使用上足够简单。DRouter对于使用者来说几乎是无成本的,只需要在使用路由的页面定义一个类注解@DRoute即可,页面路由的使用也相当简单。

DRouter的特性

链式调用设计,写法简单;

使用编译时处理注解生成路由映射表,性能优于运行时处理编译的路由方案;

路由url的设计与常规的http url一致,可以通过query参数传递页面参数;

支持通过注解直接注入跳转参数;

支持多个路由url跳转至同一个页面;

支持路由的正则匹配;

支持Activity启动使用不同的Flag;

支持路由的优先级配置;

支持对路由的动态拦截、监听以及降级;

后期将增加action支持,支持通过一个Router链接执行一个方法;

关于DRouter的设计

DRouter URI定义

对于DRouter URI的定义为了使用起来更自然,我们选择模仿HTTP URI协议:

9627b1dc04ec46040433bbbf60f9074c.png * Scheme的定义目前我们支持dwd、dwd-rider、dwd-shop,当然之后有其它端需要接入时,可以自定义拓展; * Host我们定义了view、action,其中view表示这个是一个页面跳操作,action表示执行一个method; * Path则是与路由表对应,表示一个页面或方法; * Query参数与传统的http get query参数一致,支持拼接基础数据类型、String、 JSON 串;

DRouter 执行流程

4cb3339a42840a15abf9a549ae5c698a.png * 根据解析传入的DRouter URI创建DRouteRequest对象,并且set调用者传入的callback、flags、requestCode、extras等; * 判断是否有设置拦截器,如果有设置拦截器则进行执行拦截器方法,本次DRouter执行流程结束,通知调用者本次请求被拦截; * 如果没有拦截器,则与路由表中的path进行匹配,如果匹配通过则Intent构建; * 将参数put到构建完成的Intent中传到目标页面;

DRouter的使用

接下来我们来实战一番,一个 Android 项目怎么接入这个DRouter框架,完成路由的生成、跳转、拦截器的使用等流程。

集成

在工程根目录的build.gradle中加入:

allprojects {

repositories {

maven { url "http://192.168.1.31:8081/repository/lib-dwd-snapshots/"}

maven { url "http://192.168.1.31:8081/repository/lib-dwd-releases/"}

}}

在需要使用module build.gradle中加入:

defaultConfig {

javaCompileOptions {

annotationProcessorOptions {

arguments = ["moduleName": project.name]

}

}

}

dependencies {

compile 'com.dwd.drouter:routercenter:1.0.1'

annotationProcessor 'com.dwd.drouter:compiler:1.0.0'

}

OK,这样你的工程里面就可以使用DRouter了;

使用

一行代码完成各种复杂的跳转:

DRouter.with(context).load(uri).extra("name","张三").launch();

链式api,清晰明了,使用简单,当然要达到这么有B格的跳转还是得先做点基建工作;

1、初始化DRouter

在你的Application中的onCreate方法中加入:

public void onCreate() {

//这里要加入所有使用DRouter的module name

DRouter.init("module1", "module2", ...);

}

2、通过注解创建路由表

在你需要Router化的页面使用@DRoute(path="/main")注解来为这个页面在路由表创建一个path:

@DRoute(path="/main")

public class MainActivity extends Activity{

@override

public void onCreate(Bundle args) {

super.onCreate(args);

}

}

没错,只要这么一个注解,你这个页面就完成Router化了;

3、创建并使用interceptor

在很多时候,我们在打开一个页,必须先登陆,这个时候我们总不可能在每次跳转一个页面前先判断一下是否登陆、执行登陆逻辑,因此我们就引入拦截器,那么怎么创建interceptor呢?也很简单:

@Interceptor("login")

public class LoginInterceptor implements DRouteInterceptor{

@Override

public boolean intercept(@Nullable Object source, DRouteRequest routeRequest) {

if (source instanceof Context && !BaseApplication.getInstance().isLogin()) {

DRouter.with((Context) source)

.load(Uri.parse("dwd://view/login"))

.extra("routerUrl", routeRequest.getUri().toString())

.launch();

return true;

}

return false;

}

}

这是一个比较典型的登陆interceptor,逻辑很简单,就是判断是否有登陆,如果没有登陆,就跳转到登陆界面,并且目标页面的routerUrl传递过去,使得登陆成功后可以继续跳转到目标页面,然后return true表示这个router跳转被拦截了;

那么interceptor创建好之后怎么使用它呢?其实也很简单,只需要在DRoute注解的interceptor参数中设置好你的登陆interceptor即可:

@DRoute(path="/main", interceptor="login")

public class MainActivity extends Activity{

@override

public void onCreate(Bundle args) {

super.onCreate(args);

}

}

4、通过注解注入参数

一般跳转到一个页面都是需要传入参数的,使用DRouter你可以直接使用注解注入参数,所有的参数DRouter会通过编译时处理注解方式自动注入到目标页面,在不降低性能的情况下极大减少了你的代码量,具体用法如下:

@DRoute(path="/main", interceptor="login")

public class MainActivity extends Activity{

@Param(key = "name")

String name;

@override

public void onCreate(Bundle args) {

super.onCreate(args);

DRouter.injectParams(this);

}

}

总结

DRouter目前是一个很轻巧、简单、清晰的路由框架、可以将Push、Weex、H5与Native端之间的相互跳转无缝的整合在一起,当然目前也存在很多待优化的地方,我也会逐步的去优化完善它。

相关文章:

  • WEB2.0下的门户网站建设
  • android https 证书过期变更,使用自定义证书的Android https连接
  • android7彩蛋oppo,OPPO ColorOS 7来了!没想到重磅消息却是“彩蛋”Reno3系列?
  • 利用CodeSmith为SQL Server CE生成项目代码
  • android隐藏微信好友,如何使用微信隐藏的恢复小技巧?微信好友恢复!
  • 梦里方知此身背
  • android指纹登录demo,Android指纹认证Demo源码
  • assicdoc 转换html,Swagger+spring boot 转换为html,PDF文件等
  • 英雄会开幕致辞--分享交流,开放协作带来共同繁荣的时代
  • html按钮过渡效果,css3_transition: 体验好的过渡效果。附 好看的按钮
  • Winsocket编程之TCP/IP体系结构
  • html 属于mvvm框架,vue.js是mvvm框架吗?
  • 部署ISA网络防火墙策略
  • 计算机英语 自我介绍,计算机专业学生面试英语自我介绍
  • Windows Embedded开发资源介绍
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • co模块的前端实现
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HashMap ConcurrentHashMap
  • nodejs实现webservice问题总结
  • python大佬养成计划----difflib模块
  • Unix命令
  • vue学习系列(二)vue-cli
  • 阿里云应用高可用服务公测发布
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 好的网址,关于.net 4.0 ,vs 2010
  • 算法-插入排序
  • 跳前端坑前,先看看这个!!
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • Spring第一个helloWorld
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • # 飞书APP集成平台-数字化落地
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $GOPATH/go.mod exists but should not goland
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (编译到47%失败)to be deleted
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)php新闻发布平台 毕业设计 141646
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)iOS字体
  • (转)创业的注意事项
  • .CSS-hover 的解释
  • .NET CORE Aws S3 使用
  • .NET 表达式计算:Expression Evaluator
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [BeginCTF]真龙之力
  • [C#][DevPress]事件委托的使用