Android轻量级路由框架LiteRouter

LiteRouter

开始之前,我们介绍一下什么是“路由”

路由这个概念来自于Web前端开发,引用知乎网友的解答

不同的请求地址会交给路由处理来转发给相应的控制器处理,所以说路由就可以在转发前修改转发地址,你可以在这上面大作文章。

简单的概括:路由是一个框架,可以控制、转发对页面的跳转,并在跳转之前做任何你想要的处理。

那么,Android中为何要引入一个Web中才有的路由概念?

如果你用过一些路由框架,比如RouterAndRouteActivityRouter,它们和Web中的路由框架强调的思想很类似,注重动态跳转(比如服务器下发跳转路径)、统一转发等。

LiteRouter关注的有些许不同:

我们在团队的开发过程中,可能会遇到一些“航母级”的App,涉及到很多业务线,N个团队的合作开发,这时候如果还是“单”App的开发模式,会遇到各个业务代码冗杂、编译时间几何级上涨、发布版本需要全量测试等问题。

为了解决这个问题,出现了很多关于组件化开发的思想:

各个业务线团队专注自己的开发,在开发期间可以看做一个单独的App(独立开发,独立测试),发布时又会作为了个library,被引入到最终的App中。

这里会涉及到很多问题,比如公共资源、公共库的设计、跨业务的界面跳转等。关于组件化开发,可以参考这个文章:Android业务组件化开发实践

LiteRouter关注的正是如何在各个业务独立的情况下,实现跨业务界面跳转这一问题:

Android中通常的界面跳转指的是Activity控制器的处理,我们知道一般情况下需要知道要跳转的目标Activity,以及传递的参数内容等,这个与组件化开发思想中,业务线独立开发显然是违背的。

那么我们如何才能解决此问题呢?

前几天写Retrofit2源码分析这篇文章的时候,突然给了我灵感,App端的开发和后台的开发不就是独立的?那么,它们是如何互相“独立”最终又互相配合的呢?

显然是依靠我们的接口设计规约~ 那么如果我们也能像Retrofit那样,定义好Activity跳转的接口方法,然后调用此方法就能实现跳转,这岂不是就能解决我们的问题,于是LiteRouter诞生了~

LiteRouter基本使用

Step1:定义Activity跳转的接口

public interface IntentService {
  @ClassName("com.hiphonezhu.test.demo.ActivityDemo2")
  @RequestCode(100)
  void intent2ActivityDemo2(@Key("platform") String platform, @Key("year") int year);
}

注解介绍:

  • @ClassName:要跳转的Activity的完整路径。
  • @RequestCode:需要返回值,即startActivityForResult,如果不添加,则使用startActivity
  • @Key:Intent传递的参数的key(支持Intent可传递的所有格式)。

Step2:创建服务对象

LiteRouter liteRouter = new LiteRouter.Builder().build();
IntentService intentService = liteRouter.create(IntentService.class, ActivityDemo4.this);

ActivityDemo4.this为当前的Activity

Step3:Activity跳转

intentService.intent2ActivityDemo2("android", 2016);

有了这样一个约束,就好比一份接口设计文档,各个业务方之间可以根据需求,协商好跨业务之间的Activity跳转以及参数传递的规范问题。

不管对于调用方,还是最终跳转方,都可以根据这个接口定义,保持业务线的独立开发。

这份接口定义可以放在公共的库,便于业务需求的随时变更,只要接口定义方及时通知调用方即可,这和App与后台接口的交互的开发方式非常类似。

更多用法

  • Activity Flag设置
  • 转场动画
  • 其他原生的Intent或Activity的用法

Step1:定义方法的返回类型为IntentWrapper

public interface IntentService { 
  @ClassName("com.hiphonezhu.test.demo.ActivityDemo2")     
  @RequestCode(100) 
  IntentWrapper intent2ActivityDemo2Raw(@Key("platform") String platform, @Key("year") int year);
}

Step2:

IntentWrapper intentWrapper = intentService.intent2ActivityDemo2Raw("android", 2016);
// Intent intent = intentWrapper.getIntent();  // 原始intent,可以做任何处理
// 添加flags
intentWrapper.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// 启动Activity
intentWrapper.start();
  • 拦截器支持
LiteRouter liteRouter = new LiteRouter.Builder().interceptor(new Interceptor() {
   @Override
   public boolean intercept(IntentWrapper intentWrapper) {
       return false;
   }
}).build();

intercept方法返回false表示不做拦截,true表示拦截跳转。

这里,可以做全局统一的处理,比如用户未登录,你可以使用intentWrapper#setClassName方法,修改为登录的Activity,强制用户去登陆。

LiteRouter的原理和Retrofit非常一致,最重要的都是通过动态代理来实现接口的方法,这里不做过多介绍,感兴趣的同学可以看下源码(代码行很少~)。

源码:LiteRouter

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,472评论 25 707
  • 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角...
    一缕殇流化隐半边冰霜阅读 86,382评论 214 1,095
  • 原文链接:https://github.com/halfrost/Halfrost-Field/blob/mast...
    hament阅读 5,585评论 1 31
  • 朋友就是并不时常想起,但却无处不在!这就是朋友带给我们的一个同在感!这才是真正的朋友!我们之所以交朋友是因为爱。爱...
    田云南阅读 115评论 0 0
  • 刚剪了一个月的头发,现在又该剪了。从小,我的头发和指甲都长得特别快,老人们说,心闲长头发,人闲长指甲。我承认我一直...
    seacole阅读 311评论 0 1