美文网首页Android开发经验谈Android开发Android技术知识
美团开源路由框架(WMRouter)学习——使用篇

美团开源路由框架(WMRouter)学习——使用篇

作者: 文艺的程序狗 | 来源:发表于2018-10-17 15:40 被阅读40次

前言

由于花了比较多的时间学习该框架,初步打算分三篇文章去介绍,分别是:使用篇,源码解析篇,以及关键技术解读篇,欢迎关注探讨。WMRouter

目前的困境及想法

由于笔主之前在一个搞教育行业的某某公司,该公司开发了一个整合app,里面包括了“课前预习”、“课后复习”、“错难题复习”、“笔译”、“听力练习”、“教室监控”等模块,另外还包括学生端和教师端,并且除了以模块的形式导入到主工程还有独立打包成单独的app。由于最初是各自开发自己独立的模块,没有什么沟通和约定的,所以最初的合并经历了一段痛苦的煎熬,遇到了不小的挑战初步形成了以下的结果

  • 资源冲突:在所有的模块资源统一加上前缀
  • 引入依赖库版本不同以及重复引用: 约定好一些公共的基础库(比如网络,图片加载,数据解析等)
  • 打包时间过长(我用的mac打包时间在10分钟左右,同时用的windows 8g运行内存打包时间在40多分钟):没有彻底解决
  • 主工程引用自module直接通过实现类实现跳转未能实现接口分离:没有解决
  • 同层级的业务库不好通信:没有解决

虽然笔主已经离开这家公司已经快一年时间,不过有时间总会回忆起以前采坑的种种。
在学习该框架之后,我会这样的改进



按照官方的说法主要可以解决四个问题

  • 通信问题
  • 复用问题
  • 依赖注入
  • 编译问题

详细参见官方指导或在文末查看参考链接
接下来介绍如何使用

使用

五个注解的使用

官方提供了五个注解,分别是RouterUriRouterServiceRouterRegexRouterProviderRouterPage,接下来分别介绍它们的使用

RouterUri

说明:可以注解在Activity(可以是类名字符串或者是类)和UriHandler上

  • String[] path :定义的路径
  • String scheme,host :定义协议和域名 根据协议和域名可以实现外部跳转(具体下面会讲如何跳转)
  • boolean exported: 是否允许外部跳转
  • Class[] interceptors:对Request拦截处理

例子

由于官方demo里都有案例,这里我就讲一个demo没有的情况:从其他app跳转到指定的类
在官方demo里有个类UriProxyActivity在AndroidManifest.xml定义了过滤条件(intent-filter

 <data
                    android:host="demo_host"
                    android:scheme="demo_scheme" />

这里我们在别的app启动UriProxyActivity就可以通过

  Intent intent = new Intent();
                intent.setData(Uri.parse("demo_scheme://demo_host/not_exported"));
                startActivity(intent);

来进行跳转,运行该跳转发现弹出Toast “没有权限(403)”,说明跳转成功,相应的改成demo_scheme://demo_host/exported则跳转到ExportedActivity

PS: ExportedActivity的exported 设置为true
NotExportedActivity设置为false

RouterService

说明:声明一个Service,通过interface和key加载实现类。此注解可以用在任意类上
这算是一个工具,通过Router的相应方法可以直接获取相应的实现类
相应的方法有

  • <I, T extends I> T getService(Class<I> clazz, String key)
    创建指定key的实现类实例,使用 {@link RouterProvider} 方法或无参数构造
  • <I, T extends I> T getService(Class<I> clazz, String key, Context context)
    创建指定key的实现类实例,使用Context参数构造
  • <I, T extends I> List<T> getAllServices(Class<I> clazz)
    创建所有实现类的实例,使用 {@link RouterProvider} 方法或无参数构造

为了方便使用,在router/method里,还提供了各个参数方法,开发者可以通过 <T> T callMethod(String key, Object... args)来调用方法的实现。

通过该注解可以很容易的实现通过接口实现模块间的通信

RouterRegex

说明:指定一个正则匹配的跳转,此注解可以用在Activity和UriHandler上
可以算是RouterUri的扩展,只不过它的匹配规则是通过正则表达式,这里不作过多说明

RouterProvider

说明:指定一个静态方法,用于构造Service
在前面介绍RouterService说过获取接口实现类的时候都会事先获取被RouterProvider注解过的静态方法返回该实现类。

RouterPage

说明:指定一个内部页面跳转,此注解可以用在Activity和UriHandler上

该注解处理且只处理所有格式为 wm_router://page/* 的URI(参见PageAnnotationHandler

其他

其它也没什么要介绍的了,官方的demo已经介绍的足够详细了

PS:蓦然发现 发现这篇文章有点多余!!!很多时间发觉看了源码之后,觉得自己写出如何使用都显得多此一举。有兴趣欢迎看我第二篇文章——源码解析篇。

天气凉了,大家注意保暖

参考链接

https://tech.meituan.com/meituan_waimai_android_open_source_routing_framework.html
https://tech.meituan.com/meituan_food_delivery_android_architecture_evolution.html
https://github.com/meituan/WMRouter

相关文章

网友评论

    本文标题:美团开源路由框架(WMRouter)学习——使用篇

    本文链接:https://www.haomeiwen.com/subject/ihdlzftx.html