软件编程
位置:首页>> 软件编程>> Android编程>> Android组件化开发路由的设计实践

Android组件化开发路由的设计实践

作者:breaktian  发布时间:2021-06-20 00:27:24 

标签:android,组件化,路由

调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先做个比较实用的。 VpRouter路由框架主要应用于组件化开发中

设计目的

  1. 解耦

  2. 跨模块跳转

  3. 方便服务器配置schema,实现动态配置跳转目标

  4. 对外部提供远程访问的功能,实现跨应用调用响应

主要功能点

  1. 支持intent,http,schema三种跳转

  2. 路由表支持xml配置,可自定义,支持多路径

  3. 有 *

  4. 同时支持反射和隐式意图

  5. 支持结果回调

  6. 支持参数传递

  7. 链式调用

  8. 支持url模式传参

  9. 支持配置多个webview 实现指定非默认的webview启动url

  10. 支持配置多个prefix

重要的类

  1. VpRouter 单例模式 入口类

  2. AbsRouter 路由抽象类 主要代码

  3. RouterTable 路由表

  4. IRouterInterceptor( * ) IRouterResultCallback(结果回调)

类图

Android组件化开发路由的设计实践

加载路由配置文件


//导入路由表 在application的onCreate中
VpRouter.load(getApplicationContext(),"router.xml");

路由配置文件


<?xml version="1.0" encoding="utf-8" ?>
<root>
 schema-prefix>
   <prefix>vf://</prefix>
   <prefix>vipjr://</prefix>
   <prefix>vpjr://</prefix>
 </schema-prefix>
 <default-webview>vpjr://h5.page</default-webview>
 <rule>
   <schema>vpjr://h5.page</schema>
   <!--<action>webview</action>-->
   <class>com.vip.hybrid.h5container.H5WebViewActivity</class>
 </rule>
 <rule>
   <schema>vpjr://h5.page.pay</schema>
   <!--<action>webview</action>-->
   <class>com.vip.vpal.paydesk.support.h5.H5ContainerActivity</class>
 </rule>
 <rule>
   <schema>vpjr://paycode.entry</schema>
   <!--<action>1111</action>-->
   <class>com.vip.vpal.paycode.presentation.activity.PaymentEntryActivity</class>
 </rule>
 <rule>
   <schema>vpjr://guide</schema>
   <!--<action>basemodule.test.mainactivity</action>-->
   <class>com.vip.vf.android.GuideActivity</class>
 </rule>
</root>
  1. schema-prefix: 前缀

  2. default-webview: 默认webview的schema

  3. 每一个rule节点代表一组路由规则,被解析成Rule对象

使用示例


//启动url 默认的webview
VpRouter.get().context(this).jump("http://www.vip.com?web_title=唯品会");
//指定webview启动
VpRouter.get().context(this).webView("vpjr://h5.page.pay").jump("http://www.vip.com");

//最复杂的使用
VpRouter.get()
   .context(this)
   .setInterceptor(new IRouterInterceptor() {
     @Override
     public boolean cancel() {
       return false;//return true 会把本次跳转拦截掉
     }

@Override
     public Bundle addExtras() {
       return null;//返回Bundle 会添加到Intent中
     }
   })
   .setResultCallback(new IRouterResultCallback() {
     @Override
     public void onSuccess() {
       //跳转成功的回调
     }

@Override
     public void onFail(RouterError error) {
       //跳转失败的回调
       LogUtils.d("error:"+error);
     }
   })
   .extra("key","value")
   .extra("key2","value2")
   .flags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
   .jump("vf://paycode.entry?title=1111");//支持url传参

//最简单的使用
VpRouter.get().context(this).jump("vpjr://guide");
VpRouter.get().context(this).jumpForResult("vpjr://guide",REQUEST_CODE);//REQUEST_CODE>;

来源:https://segmentfault.com/a/1190000014910951

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com