前言
由于花了比较多的时间学习该框架,初步打算分三篇文章去介绍,分别是:使用篇,源码解析篇,以及关键技术解读篇,欢迎关注探讨。WMRouter
目前的困境及想法
由于笔主之前在一个搞教育行业的某某公司,该公司开发了一个整合app,里面包括了“课前预习”、“课后复习”、“错难题复习”、“笔译”、“听力练习”、“教室监控”等模块,另外还包括学生端和教师端,并且除了以模块的形式导入到主工程还有独立打包成单独的app。由于最初是各自开发自己独立的模块,没有什么沟通和约定的,所以最初的合并经历了一段痛苦的煎熬,遇到了不小的挑战初步形成了以下的结果
- 资源冲突:在所有的模块资源统一加上前缀
- 引入依赖库版本不同以及重复引用: 约定好一些公共的基础库(比如网络,图片加载,数据解析等)
- 打包时间过长(我用的mac打包时间在10分钟左右,同时用的windows 8g运行内存打包时间在40多分钟):没有彻底解决
- 主工程引用自module直接通过实现类实现跳转未能实现接口分离:没有解决
- 同层级的业务库不好通信:没有解决
虽然笔主已经离开这家公司已经快一年时间,不过有时间总会回忆起以前采坑的种种。
在学习该框架之后,我会这样的改进
按照官方的说法主要可以解决四个问题
- 通信问题
- 复用问题
- 依赖注入
- 编译问题
详细参见官方指导或在文末查看参考链接
接下来介绍如何使用
使用
五个注解的使用
官方提供了五个注解,分别是RouterUri
、RouterService
、RouterRegex
、RouterProvider
、RouterPage
,接下来分别介绍它们的使用
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