Awesome
Jet RouterKit
路由库;Android平台对页面、服务的路由框架。自动化且易用。
- 基于APT技术(注解-编译时生成代码,不反射,无性能损耗),通过注解方式来实现URL打开Activity功能或 执行特定动作
- 并支持在WebView和外部浏览器使用,支持路由表维护,降级访问等;
- 使用Jet技术支持Bundle、Intent,Uri参数自动注入页面并转换参数类型。
- English Version
方案对比
实现功能 | RouterKit | Airbnb 的DeepLinkDispatch | 阿里 ARouter | 天猫 统跳协议 | ActivityRouterGithub上Star最多 |
---|---|---|---|---|---|
路由注册 | 注解式APT自动注册 | 每个module都要手动注册 | 每个module的路由表都要APT类查找 | AndroidManiFest配置 | 每个module都要手动注册 |
路由查找 | 路由表 | 路由表 | 路由表 | 系统Intent | 路由表 |
路由分发 | Activity转发 | Activity转发 | Activity转发 | Activity转发 | Activity转发 |
动态替换 | 主线程 | 不支持 | 线程等待 | 不支持 | 不支持 |
动态拦截 | 主线程 | 不支持 | 线程等待 | 不支持 | 主线程 |
安全拦截 | 主线程 | 不支持 | 线程等待 | 不支持 | 主线程 |
方法调用 | 手动拼装 | 手动拼装 | 手动拼装 | 手动拼装 | 手动拼装 |
参数获取 | JET 依赖自动注入,支持所有类型 | 参数定义在path,不利于多人协作 | Apt依赖注入,但是要手动调用get方法 | 手动调用 | 手动调用 |
结果返回 | onActivityResult | onActivityResult | onActivityResult | onActivityResult | onActivityResult |
支持多Module | 支持 | 不支持 | 支持 | 不支持 | 支持 |
整体类似 阿里开源的ARoute 功能;移除分组概念,强化多Module编译和自动注册路由表,会更通用。
特色:
- 支持注解方式,APT编译器自动注册Activity 和Action(类似Struts里面的Action)
- 支持自动注入Intent,Bundle、Uri里的参数到页面使用Jet
- 支持外部浏览器打开。
- 支持HTTP协议。
- 支持多个Module。
- 支持Uri 跳转和 Action 执行;
- 路由表自动初始化,也可以手动再维护;
- 支持服务端下发路由配置,简单支持页面降级功能;
功能:
- Apt实现自动路由注册,支持多Module
- 路由表维护
- Activity转发 和 Action转发(支持URI页面跳转和方法调用)
原理图
典型应用
- 从外部URL映射到内部页面,以及参数传递与解析
- 跨模块页面跳转,模块间解耦
- 拦截跳转过程,处理登陆、埋点等逻辑
- 跨模块API调用,通过控制反转来做组件解耦
使用范例
- 声明1: 页面跳转
@JUri("/home")
public class IntentActivity extends AppCompatActivity {
// Uri 的参数通过 Intent传递进来, 推荐使用Jet自动读取;
.....
//
}
- or 声明2: 服务功能调用:
//支持,多个地址 @JUri(array={"/home","/action"})
@JUri("/action")
public class TestAction extends Action {
Context context = MyApplication.getContext();
@Override
public void run(Map queryMap) {
super.run(queryMap);
//Uri 里面的参数通过Map传递进来
String result = (String) queryMap.get("param");
Toast.makeText(context, "Test Action: " + result, Toast.LENGTH_SHORT).show();
}
}
- 方法调用
// 尽可能早,推荐在Application中初始化,初始化路由表
Router.getInstance().init(mApplication);
// 方式一
String uri = "meiyou:///home";
Router.getInstance().run(uri);
// 方式二
Router.getInstance().run(context, Uri.parse("meiyou:///second?uid=233"));
// 方式三
// 如果AndroidManifest.xml注册了RouterCenterActivity,也可以通过下面的方式打开,如果是APP内部使用,不建议使用。
// startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("meiyou:///home?uid=233")));
从外部浏览器、其它APP打开
只要在AndroidManifest.xml注册了RouterCenterActivity,即可变成经典的Uri打开,可以支持外部浏览器、其它APP打开内部的Activity。
<activity android:name="com.jet.router.RouterCenterActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="test" />
</intent-filter>
</activity>
// Java代码调用
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("meiyou:///second?uid=233&name=Wiki")));
// HTML方式,系统浏览器(不支持微信,微信内部开网页会禁止所有的Scheme)
<a href="test:///second?uid=233&name=Wiki">打开JoyrunApp的SecondActivity</a>
支持拦截器,典型应用就是:某些URI需要授权才能访问
通过前置拦截器可以对URL进行拦截,可以通过拦截器对URL进行修改,也可以拦截URL,不让路由器打开。
Router.addInterceptor(new UriInterceptor() {
public String beforeExecute(InterceptorData data) {
//return url.replace("test://www.XXX.com/","test://");
return data;
}
});
支持 设置Scheme ,只有允许的Scheme才有效;才允许路由分发
Router.addScheme("meiyou");
集成
在gradle文件配置:
//内部版本:0.0.1-SNAPSHOT
compile "com.jet.framework:router:1.0.0"
混淆
常见问题
- Intent参数自动注入IOC - Jet
- 参考Android 组件化 —— 路由设计最佳实践
- 开源最佳实践:Android平台页面路由框架ARouter
- iOS 组件化 —— 路由设计思路分析
- [前端组件化]Vue.js And React 组件化(https://halfrost.com/vue_ios_modularization/)
- LiteRouter模仿retrofit,各个业务分根据需求约定好接口,就像一份接口文档一样
- routable-android 模式匹配方式的路由
- NodeJs-Express 路由框架
TODO
- JUri 支持数组数据(fixed)
- Module传递依赖解决 (fixed)
- 自定义 注解实现,可以再自定义额外的路由表,实现自定义的注解的路由,Door接口的优化
- Gradle Plugin实现,APT 主工程 需要配置编译过程问题
- 拦截器排序,优先级 priority
- 路由匹配规则Matcher功能升级, Pattern 模式匹配
- 调用方式接口化,like: retrofit;
- 路由结果回调? isNeed?
- Kotlin版本实现
- 路由表初始化异步线程化
- 安全性
- like Express, 拦截器,中间件化?
交流群:
QQ群:547612870
License
Copyright 2017 gybin02@163.com
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.