0.

最近接收了从前的项目,之前的代码比较凌乱,准备重构。整个项目其实功能比较明显,而且产品还想给他打造成比较成熟牛逼的app,那么组件化开发势在必行。众所周知,模块开发,路由先行,就有了这篇文章。自从用了Kotlin后,感觉Java那些繁琐的语法和喋喋不休的空指针判断让人恶心,于是决定用Kotlin来写一个Router

1.

项目地址Router

代码,想好再写,首先分析一下为什么需要模块化开发,为什么路由并且这个路由需要什么功能。

1.1

为什么使用模块化开发:随着项目的越来越大,如果把所有功能都放到一个module里,对开发和测试来说都有一个效率问题,对开发来讲,由于各种业务代码混合在一起,出现问题不好定位,对测试来讲,每次修改都要重新编译整个项目测试。采用组件化开发,讲业务模块分到一个一个module里,彼此间相互独立,这样既容易定位问题,也方便测试人员进行测试,因为只需要测试相应的module即可。所以我们的项目结构应该是这样的

1.2

为什么使用路由:上面说了,每个module是彼此独立的,而要实现activity的跳转就需要彼此引用,这是我们不想看到的,模块间应该是没有依赖的,那么如何实现不同模块的跳转呢?就需要路由了。

1.3

这个路由需要什么功能:目前所需要的就是根据url实现不同模块之间的Activity跳转,包括传递参数,类似startActivity和startActivityForResult,得到不同模块的fragment。

2.

需求想好了,该想怎么实现了。activity跳转有两种,隐式调用和显示调用,如果采取隐式调用就要为每个activity注册intent-filter,麻烦,那就只能显示调用了,但是显示调用是需要class对象的,不同module是不能得到class对象的,这怎么搞?编译前得不到,运行时总行吧,所以我们需要一个容器来存储不同moudle里的class对象,并且能通过一个值来进行区分,所以我们需要一个map,而值就是用来区分各个activity和fragment的url。 第二个问题来了,url如何确定,class对象怎么得到,又怎么放进map里。这里我们采用注解来做,我们用在注解里声明了url,同时自定义Processor,在编译时生成java文件,里面只有一个方法

public void putRouteClass(ArrayMap<String, Class<?>> routableMap) {
routableMap.put("test", MainActivity.class);
}
复制代码

根据讲每个module里添加注解的Activity和fragment的class对象放入传入的map里。之后再Application的onCreate方法里,调用Router的register方法

fun register(vararg moduleNames: String){for (moduleName in moduleNames){try{val cla = Class.forName(Constants.PACKAGE_NAME + Constants.DOT + moduleName + "_" + Constants.ROUTER_TABLE_IMP)val routerTable = cla.newInstance() as RouterTablerouterTable.putRouteClass(classMap)} catch (e: ClassNotFoundException){e.printStackTrace()} catch (e: Exception){e.printStackTrace()}}}
复制代码

这个方法很简单,调用每个module里利用Processor生成的对象的putRouteClass方法,将Router里的一个全局map传入,这样,这个map就持有了所有添加注解的Activity和fragment的url以及对应的class对象。有了class对象,那想怎么搞就怎么搞了

//类似startActivity
fun go(context: Context, url: String, extras: Bundle? = null){val intent = Intent(context, classMap[url])if (extras != null){intent.putExtras(extras)}context.startActivity(intent)}fun go(fragment: Fragment,url: String, extras: Bundle? = null){val context=fragment.contextif(context!=null){go(context, url, extras)}}//类似startActivityForResultfun goForResult(context: Context, url: String, requestCode: Int, extras: Bundle? = null){val intent = Intent(context, classMap[url])if (extras != null){intent.putExtras(extras)}if (context is Activity){context.startActivityForResult(intent, requestCode)} else if (context is Fragment){context.startActivityForResult(intent, requestCode)}}//得到fragmentfun getFragment(url: String): Fragment?{try{val cla = classMap[url]if (cla != null){return cla.newInstance() as Fragment} else{}} catch (e: ClassNotFoundException){e.printStackTrace()} catch (e: Exception){e.printStackTrace()}return null}
复制代码

3.

有些坑:

3.1

注册注解解释器的时候,不要使用google的autoservice库了,采用resoureces,META-INF,不然没效果。别问为什么,我也不知道

3.2

在gradle文件里使用注解解释器使用kapt代替annoationProcessor

apply plugin: 'kotlin-kapt'
dependencies {
kapt project(':processor')
api project(':router')
}
复制代码

3.3

生成的java文件在每个module的build/generated/source/kapt里

4.

其实在上家公司的时候就打算写一个路由,只是由于种种原因最近没能成型,这里只是给大家提供一种思路,作为思路文,就不在普及注解和编译时注解解释器了,请自行查询资料。

用Kotlin打造一个Router相关推荐

  1. 宅社V0.2.0发布并开源,从零开始打造一个面向产品级应用

    宅社AcgClub,一款纯粹的ACG聚合类App 项目地址:https://github.com/Rabtman/AcgClub 出于爱好与学习的目的做出了这款MD风格的应用,旨意通过涵盖Androi ...

  2. 单独组件_阿里P8年薪百万大牛-教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: http://blog.csdn.n ...

  3. 用个人博客打造一个酷酷的工作流

    用个人博客打造一个酷酷的工作流! 每个前端都应该拥有一个自己的博客.因为它不仅仅是一个博客.更是属于自己的一个工作流.如何来理解这个问题呢.这也就是我要开发一个博客的初衷. 似乎自己也没有一个写博客的 ...

  4. 赠书 | 手把手教你自己动手打造一个智能恒温器

    作者 | Yazeed Sabri 翻译 | 火火酱,责编 | 晋兆雨 出品 | AI科技大本营 头图 | 付费下载于视觉中国 *文末有赠书福利 为了能住得离公司近一点,我就搬进了一套没有温控系统的公 ...

  5. 打造一个TB级微服务日志监控平台

    本文主要介绍怎么使用 ELK Stack 帮助我们打造一个支撑起日产 TB 级的日志监控系统.在企业级的微服务环境中,跑着成百上千个服务都算是比较小的规模了.在生产环境上,日志扮演着很重要的角色,排查 ...

  6. 如何打造一个经常宕机的业务系统?

    作者| Mr.K   整理| Emma 来源| 技术领导力(ID:jishulingdaoli) 删库跑路专家.宕机行为艺术家.肥胖版吴彦祖--老K,曾经说过:"打造一个偶尔宕机的系统并不难 ...

  7. vue.js+socket.io打造一个好玩的新闻社区

    title: Socket.io+vue打造新闻社区 date: 2017-06-12 20:19:05 tags: [vue.js,javascript,socket.io] vue2.0 + so ...

  8. 如何打造一个搞垮团队的绩效考核?

    ‍‍ 作者 | 程军 来源 | 军哥手记(ID:zxhy_cj) 我从业 15 年,前 5 年一直被别人考核,5 年之后除了被别人考核还考核别人,这些年来,我估计了一下,也考核了大好几百人,我相信没多 ...

  9. 打造一个名博需要多久

    每个人评价博客的标准是不同的,在IT人眼中,月光博客是名博:在站长眼中,牟长青和卢松松是名博:在SEOer人眼中,ZAC是名博:在设计师眼中,腾讯CDC是名博:在文艺青年眼中,左岸读书是名博:在创业团 ...

最新文章

  1. 执行在一行中组合多个Linux命令
  2. 科大星云诗社动态20210202
  3. C# 打印PDF文档的10种方法
  4. 该文件没有与之关联的程序来执行该操作_Liunx tty子系统分析之三 tty字符设备文件操作接口说明...
  5. How to Leak a Context: Handlers Inner Classes
  6. 两边双虚线是什么意思_锯齿车道、倒三角标志什么意思?以下5种交通标线你认识几个?...
  7. python unicode编码转换中文_Python入门高级教程--Python 中文编码
  8. 甲骨文创始人埃里森的10大混蛋行为:曾翻微软垃圾堆
  9. 差分管电路图_DIY一款差分输入的晶体管功放电路图
  10. C++中数据类型int, short, long, long long的数据范围
  11. 信息安全软考—— 第五章 物理与环境安全技术 学习笔记
  12. 陌生人交友软件有哪些?陌生人社交APP排名|良心推荐
  13. 伊利洛伊大学厄巴纳-香槟分校计算机专业,伊利诺伊大学厄巴纳香槟分校信息管理专业怎么样?...
  14. 数据结构之冒泡排序的两个优化细节
  15. tensorflow2计算flops
  16. 虚拟IP人物,同时空出现——思念党的福音
  17. 公务员考试计算机专业类别,专业!公务员专业类别划分
  18. HTTP的8种请求方式
  19. 用mpg123播放https协议的URL MP3
  20. asp环境配置,以及serv_u,dreamware的使用,

热门文章

  1. aida64内存稳定性测试_250元就能买到16GB内存 这背后究竟是道德的沦丧还是人性的扭曲?...
  2. java读取属性文件的方法_java读取属性文件的方法
  3. 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
  4. xgboost学习率不能大于1的原因
  5. xgboost与coo_matrix
  6. 收费最低的云存储_百度云:虚拟主机11元/6个月,入门级云服务器60元/年
  7. C语言中图形方式界面怎么,「分享」C语言如何编写图形界面
  8. 单调队列(一套模板通吃)
  9. 三台机器搭建MySQL一主二从
  10. elon函数_Neuroink Elon麝香制造中的灾难