Home

Awesome

Jet RouterKit

Download qq群 License

路由库;Android平台对页面、服务的路由框架。自动化且易用。 原理图

方案对比

实现功能RouterKitAirbnb 的DeepLinkDispatch阿里 ARouter天猫 统跳协议ActivityRouterGithub上Star最多
路由注册注解式APT自动注册每个module都要手动注册每个module的路由表都要APT类查找AndroidManiFest配置每个module都要手动注册
路由查找路由表路由表路由表系统Intent路由表
路由分发Activity转发Activity转发Activity转发Activity转发Activity转发
动态替换主线程不支持线程等待不支持不支持
动态拦截主线程不支持线程等待不支持主线程
安全拦截主线程不支持线程等待不支持主线程
方法调用手动拼装手动拼装手动拼装手动拼装手动拼装
参数获取JET 依赖自动注入,支持所有类型参数定义在path,不利于多人协作Apt依赖注入,但是要手动调用get方法手动调用手动调用
结果返回onActivityResultonActivityResultonActivityResultonActivityResultonActivityResult
支持多Module支持不支持支持不支持支持

整体类似 阿里开源的ARoute 功能;移除分组概念,强化多Module编译和自动注册路由表,会更通用。

特色:

  1. 支持注解方式,APT编译器自动注册Activity 和Action(类似Struts里面的Action)
  2. 支持自动注入Intent,Bundle、Uri里的参数到页面使用Jet
  3. 支持外部浏览器打开。
  4. 支持HTTP协议。
  5. 支持多个Module。
  6. 支持Uri 跳转和 Action 执行;
  7. 路由表自动初始化,也可以手动再维护;
  8. 支持服务端下发路由配置,简单支持页面降级功能;

功能:

原理图

原理图

URI定义

典型应用

  1. 从外部URL映射到内部页面,以及参数传递与解析
  2. 跨模块页面跳转,模块间解耦
  3. 拦截跳转过程,处理登陆、埋点等逻辑
  4. 跨模块API调用,通过控制反转来做组件解耦

使用范例

@JUri("/home")
public class IntentActivity extends AppCompatActivity {
    // Uri 的参数通过 Intent传递进来, 推荐使用Jet自动读取;
    .....
    //
}
//支持,多个地址 @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"

混淆

常见问题

TODO

交流群:

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.