Android平台阿里页面路由ARouter

之前项目里使用阿里的页面路由框架感觉挺不错的,趁着有空跟大家分享一下。


一、为什么需要路由框架

原生的路由方案存在的问题
首先谈一谈原生的路由方案存在的问题以及为什么需要路由框架。我们所使用的原生路由方案一般是通过显式intent和隐式intent两种方式实现的,而在显式intent的情况下,因为会存在直接的类依赖的问题,导致耦合非常严重;而在隐式intent情况下,则会出现规则集中式管理,导致协作变得非常困难。而且一般而言配置规则都是在Manifest中的,这就导致了扩展性较差。除此之外,使用原生的路由方案会出现跳转过程无法控制的问题,因为一旦使用了StartActivity()就无法插手其中任何环节了,只能交给系统管理,这就导致了在跳转失败的情况下无法降级,而是会直接抛出运营级的异常。

6eb2eafbd4c419c493dbbfb1b05064087cda2173

这时候如果考虑使用自定义的路由组件就可以解决以上的一些问题,比如通过URL索引就可以解决类依赖的问题;通过分布式管理页面配置可以解决隐式intent中集中式管理Path的问题;自己实现整个路由过程也可以拥有良好的扩展性,还可以通过AOP的方式解决跳转过程无法控制的问题,与此同时也能够提供非常灵活的降级方式。

为什么要用路由组件

前面提到的主要是开发与协作中的问题,而使用一款路由框架时还会涉及到其他的两个大方面:一方面是组件化,而另一方面就是Native和H5的问题。刚才所提到的主要是开发和协作中作为开发者所需要面对的问题,而一旦一款APP达到一定体量的时候,业务就会膨胀得比较严重,而开发团队的规模也会越来越大,这时候一般都会提出组件化的概念。组件化就是将APP按照一定的功能和业务拆分成多个小组件,不同的组件由不同的开发小组来负责,这样就可以解决大型APP开发过程中的开发与协作的问题,将这些问题分散到小的APP中。目前而言组件化已经有非常多比较成熟的方案了,而自定义路由框架也可以非常好地解决整个APP完成组件化之后模块之间没有耦合的问题,因为没有耦合时使用原生的路由方案肯定是不可以的。

8bb959df9d1efd0d791ced1a477182fae86cc22f

另外一个问题就是Native与H5的问题,因为现在的APP很少是纯Native的,也很少会有纯H5的,一般情况下都是将两者进行结合。这时候就需要非常便捷并且统一的跳转方案,因为在H5中是无法使用StartActivity()跳转到Native页面的,而从Native跳转到H5页面也只能通过配置浏览器的方式实现。

路由框架的特点
为了解决以上的问题就需要实现一个自定义的路由框架,而路由框架一般都具有以下的三种特点:

  1. 分发:把一个URL或者请求按照一定的规则分配给一个服务或者页面来处理,这个流程就是分发,分发是路由框架最基本的功能,当然也可以理解成为简单的跳转。

  2. 管理:将组件和页面按照一定的规则管理起来,在分发的时候提供搜索、加载、修改等操作,这部分就是管理,也是路由框架的基础,上层功能都是建立在管理之上。

  3. 控制:就像路由器一样,路由的过程中,会有限速、屏蔽等一些控制操作,路由框架也需要在路由的过程中,对路由操作做一些定制性的扩展,比方刚才提到的AOP,后期的功能更新,也是围绕这个部分来做的。

以上文字都是copy,出处是http://www.see-source.com/blog/300000036/1641.html。
ARouter的项目地址是:https://github.com/alibaba/ARouter
集成如下
[html] view plain copy
  1. //阿里路由https://github.com/alibaba/ARouter  
  2.     compile 'com.alibaba:arouter-api:1.2.1.1'  
  3.     annotationProcessor 'com.alibaba:arouter-compiler:1.1.2.1'  
[html] view plain copy
  1. <activity android:name="commonmodule.schamefilter.SchameFilterActivity">  
  2.             <intent-filter>  
  3.                 <data  
  4.                     android:host="fuyun.sq.com"  
  5.                     android:scheme="http"/>  
  6.                 <action android:name="android.intent.action.VIEW"/>  
  7.                 <category android:name="android.intent.category.DEFAULT"/>  
  8.                 <category android:name="android.intent.category.BROWSABLE"/>  
  9.             </intent-filter>  
  10.         </activity>  
host和scheme可以随便改.
[html] view plain copy
  1. public class SchameFilterActivity extends Activity {  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         Uri uri = getIntent().getData();  
  6.         ARouter.getInstance().build(uri).navigation();  
  7.         finish();  
  8.     }  
  9. }  
在Application里面进行初始化
[html] view plain copy
  1. ARouter.openLog();     // 打印日志  
  2.         ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)  
  3.         ARouter.init(this); // 尽可能早,推荐在Application中初始化  
然后建一个类对路由统一管理
[html] view plain copy
  1. public class RouteRule {  
  2.   
  3.     static RouteRule mRouteRule;  
  4.   
  5.     public static RouteRule getInstance(){  
  6.         if (mRouteRule == null){  
  7.             mRouteRule = new RouteRule();  
  8.         }  
  9.         return mRouteRule;  
  10.     }  
  11.   
  12.     /**  
  13.      * 路由地址http://fuyun.sq.com/main/Main  
  14.      * 打开主界面  
  15.      */  
  16.     public void openMainActivity(){  
  17.         ARouter.getInstance().build("/main/Main").navigation();  
  18.     }  
  19.   
  20.     /**  
  21.      * 路由地址http://fuyun.sq.com/main/Information  
  22.      * 打开资讯界面  
  23.      * @param position 主页的6个分类  
  24.      */  
  25.     public void openInformation(int position){  
  26.         ARouter.getInstance().build("/main/Information").withInt("type",position).navigation();  
  27.     }  
  28.   
  29.     /**  
  30.      * 路由地址http://fuyun.sq.com/main/UserCenter  
  31.      * 打开个人中心界面  
  32.      */  
  33.     public void openUserCenterActivity(){  
  34.         ARouter.getInstance().build("/main/UserCenter").navigation();  
  35.     }  
  36.   
  37.     /**  
  38.      * 路由地址http://fuyun.sq.com/main/wxLogin  
  39.      * 打开微信界面  
  40.      */  
  41.     public void openWxLoginActivity(){  
  42.         ARouter.getInstance().build("/main/wxLogin").navigation();  
  43.     }  
  44.   
  45.     /**  
  46.      * 打开详情页  
  47.      * @param url  
  48.      * @param title  
  49.      */  
  50.     public void openWebActivity(String url,String title){  
  51.         ARouter.getInstance().build("/main/web").withString("url",url).withString("title",title).navigation();  
  52.     }  
  53. }  
在要跳转的类里面配置,如果要接收参数,加上
[html] view plain copy
  1. ARouter.getInstance().inject(this);  
无参数跳转不用加,如图




  1. 嗯,具体文档可以看阿里的github。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值