iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何搭建Alibaba-ARouter中的Android页面路由框架
  • 427
分享到

如何搭建Alibaba-ARouter中的Android页面路由框架

androidalibabaarouter 2023-05-30 18:05:58 427人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关如何搭建Alibaba-ARouter中的Android页面路由框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。开发一款App,总会遇到各种各样的需求和业务,这

这篇文章将为大家详细讲解有关如何搭建Alibaba-ARouter中的Android页面路由框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

开发一款App,总会遇到各种各样的需求和业务,这时候选择一个简单好用的轮子,就可以事半功倍

前言

  Intent intent = new Intent(mContext, XxxActivity.class);  intent.putExtra("key","value");  startActivity(intent);  Intent intent = new Intent(mContext, XxxActivity.class);  intent.putExtra("key","value");  startActivityForResult(intent, 666);

上面一段代码,在Android开发中,最常见也是最常用的功能就是页面的跳转,我们经常需要面对从浏览器或者其他App跳转到自己App中页面的需求,不过就算是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:

  1. 集中式的URL管理:谈到集中式的管理,总是比较蛋疼,多人协同开发的时候,大家都去AndroidManifest.xml中定义各种IntentFilter,使用隐式Intent,最终发现AndroidManifest.xml中充斥着各种Schame,各种Path,需要经常解决Path重叠覆盖、过多的Activity被导出,引发安全风险等问题

  2. 可配置性较差:Manifest限制于xml格式,书写麻烦,配置复杂,可以自定义的东西也较少

  3. 跳转过程中无法插手:直接通过Intent的方式跳转,跳转过程开发者无法干预,一些面向切面的事情难以实施,比方说登录、埋点这种非常通用的逻辑,在每个子页面中判断又很不合理,毕竟activity已经实例化了

  4. 跨模块无法显式依赖:在App小有规模的时候,我们会对App做水平拆分,按照业务拆分成多个子模块,之间完全解耦,通过打包流程控制App功能,这样方便应对大团队多人协作,互相逻辑不干扰,这时候只能依赖隐式Intent跳转,书写麻烦,成功与否难以控制。

另一个轮子

为了解决以上问题,我们需要一款能够解耦、简单、功能多、定制性较强、支持拦截逻辑的路由组件:我们选择了Alibaba的ARouter。

一、功能介绍

  1. 支持直接解析URL进行跳转、参数按类型解析到Bundle,支持Java基本类型(*)

  2. 支持应用内的标准页面跳转,api接近Android原生接口

  3. 支持多模块工程中使用,允许分别打包,包结构符合Android包规范即可(*)

  4. 支持跳转过程中插入自定义拦截逻辑,自定义拦截顺序(*)

  5. 支持服务托管,通过ByName,ByType两种方式获取服务实例,方便面向接口开发与跨模块调用解耦(*)

  6. 映射关系按组分类、多级管理,按需初始化,减少内存占用提高查询效率(*)

  7. 支持用户指定全局降级策略

  8. 支持获取单次跳转结果

  9. 丰富的API和可定制性

  10. 被ARouter管理的页面、拦截器、服务均无需主动注册到ARouter,被动发现

  11. 支持Android N推出的Jack编译链

二、不支持的功能

  1. 自定义URL解析规则(考虑支持)

  2. 不能动态加载代码模块和添加路由规则(考虑支持)

  3. 多路径支持(不想支持,貌似是导致各种混乱的起因)

  4. 生成映射关系文档(考虑支持)

三、典型应用场景

  1. 从外部URL映射到内部页面,以及参数传递与解析

  2. 跨模块页面跳转,模块间解耦

  3. 拦截跳转过程,处理登陆、埋点等逻辑

  4. 跨模块API调用,模块间解耦(注册ARouter服务的形式,通过接口互相调用)

四、基础功能

添加依赖和配置

apply plugin: 'com.neenbedankt.android-apt'

 buildscript {  repositories {   jcenter()  }  dependencies {   classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'  } } apt {  arguments {   moduleName project.getName();  } } dependencies {  apt 'com.alibaba:arouter-compiler:x.x.x'  compile 'com.alibaba:arouter-api:x.x.x'  ... }

添加注解

 // 在支持路由的页面、服务上添加注解(必选) // 这是最小化配置,后面有详细配置 @Route(path = "/test/1") public class YourActivity extend Activity {  ... }

初始化SDK

 ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化

发起路由操作

 // 1. 应用内简单的跳转(通过URL跳转在'中阶使用'中) ARouter.getInstance().build("/test/1").navigation(); // 2. 跳转并携带参数 ARouter.getInstance().build("/test/1")    .withLong("key1", 666L)    .withString("key3", "888")    .navigation();

添加混淆规则(如果使用了Proguard)

 -keep public class com.alibaba.android.arouter.routes.**{*;}

五、进阶用法

通过URL跳转

 // 新建一个Activity用于监听Schame事件 // 监听到Schame事件之后直接传递给ARouter即可 // 也可以做一些自定义玩法,比方说改改URL之类的 // Http://www.example.com/test/1 public class SchameFilterActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   // 外面用户点击的URL   Uri uri = getIntent().getData();   // 直接传递给ARouter即可   ARouter.getInstance().build(uri).navigation();   finish();  } } // AndroidManifest.xml 中 的参考配置 <activity android:name=".activity.SchameFilterActivity">   <!-- Schame -->   <intent-filter>    <data     android:host="m.aliyun.com"     android:scheme="arouter"/>    <action android:name="android.intent.action.VIEW"/>    <cateGory android:name="android.intent.category.DEFAULT"/>    <category android:name="android.intent.category.BROWSABLE"/>   </intent-filter>   <!-- App Links -->   <intent-filter android:autoVerify="true">    <action android:name="android.intent.action.VIEW"/>    <category android:name="android.intent.category.DEFAULT"/>    <category android:name="android.intent.category.BROWSABLE"/>    <data     android:host="m.aliyun.com"     android:scheme="http"/>    <data     android:host="m.aliyun.com"     android:scheme="https"/>   </intent-filter> </activity>

使用ARouter协助解析参数类型

 // URL中的参数会默认以String的形式保存在Bundle中 // 如果希望ARouter协助解析参数(按照不同类型保存进Bundle中) // 只需要在需要解析的参数上添加 @Param 注解 @Route(path = "/test/1") public class Test1Activity extends Activity {  @Param     // 声明之后,ARouter会从URL中解析对应名字的参数,并按照类型存入Bundle  public String name;  @Param  private int age;  @Param(name = "girl") // 可以通过name来映射URL中的不同参数  private boolean boy;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   name = getIntent().getStringExtra("name");   age = getIntent().getIntExtra("age", -1);   boy = getIntent().getBooleanExtra("girl", false); // 注意:使用映射之后,要从Girl中获取,而不是boy  } }

开启ARouter参数自动注入(实验性功能,不建议使用,正在开发保护策略)

 // 首先在Application中重写 attacHBaseContext方法,并加入ARouter.attachBaseContext(); @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); ARouter.attachBaseContext(); } // 设置ARouter的时候,开启自动注入 ARouter.enableAutoInject(); // 至此,Activity中的属性,将会由ARouter自动注入,无需 getIntent().getStringExtra("xxx")等等

声明拦截器(拦截跳转过程,面向切面搞事情)

 // 比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查 // 拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行 @Interceptor(priority = 666, name = "测试用拦截器") public class TestInterceptor implements IInterceptor {    @Override  public void process(Postcard postcard, InterceptorCallback callback) {   ...   callback.onContinue(postcard); // 处理完成,交还控制权   // callback.onInterrupt(new RuntimeException("我觉得有点异常"));  // 觉得有问题,中断路由流程   // 以上两种至少需要调用其中一种,否则会超时跳过  }    @Override  public void init(Context context) {  } }

处理跳转结果

 // 通过两个参数的navigation方法,可以获取单次跳转的结果 ARouter.getInstance().build("/test/1").navigation(this, new NavigationCallback() {  @Override  public void onFound(Postcard postcard) {   ...  }  @Override  public void onLost(Postcard postcard) {   ...  } });

自定义全局降级策略

  // 实现DegradeService接口,并加上一个Path内容任意的注解即可 @Route(path = "/xxx/xxx") // 必须标明注解  public class DegradeServiceImpl implements DegradeService {    @Override  public void onLost(Context context, Postcard postcard) {    // do something.  }    @Override  public void init(Context context) {  }  }

为目标页面声明更多信息

 // 我们经常需要在目标页面中配置一些属性,比方说"是否需要登陆"之类的 // 可以通过 Route 注解中的 extras 属性进行扩展,这个属性是一个 int值,换句话说,单个int有4字节,也就是32位,可以配置32个开关 // 剩下的可以自行发挥,通过字节操作可以标识32个开关 @Route(path = "/test/1", extras = Consts.XXXX)

使用ARouter管理服务(一) 暴露服务

  public interface IService extends IProvider {  String hello(String name); }  @Route(path = "/service/1", name = "测试服务") public class ServiceImpl implements IService {  @Override  public String hello(String name) {   return "hello, " + name;  }    @Override  public void init(Context context) {  } }

使用ARouter管理服务(二) 发现服务

可以通过两种API来获取Service,分别是ByName、ByType

IService service = ARouter.getInstance().navigation(IService.class); // ByType IService service = (IService) ARouter.getInstance().build("/service/1").navigation(); // ByName service.hello("zz");

注意:推荐使用ByName方式获取Service,ByType这种方式写起来比较方便,但如果存在多实现的情况时,SDK不保证能获取到你想要的实现

使用ARouter管理服务(三) 管理依赖

可以通过ARouter service包装您的业务逻辑或者sdk,在service的init方法中初始化您的sdk,不同的sdk使用ARouter的service进行调用,每一个service在第一次使用的时候会被初始化,即调用init方法。

这样就可以告别各种乱七八糟的依赖关系的梳理,只要能调用到这个service,那么这个service中所包含的sdk等就已经被初始化过了,完全不需要关心各个sdk的初始化顺序。

六、更多功能

初始化中的其他设置

 ARouter.openLog(); // 开启日志 ARouter.printStackTrace(); // 打印日志的时候打印线程堆栈

详细的API说明

 // 构建标准的路由请求 ARouter.getInstance().build("/home/main").navigation(); // 构建标准的路由请求,并指定分组 ARouter.getInstance().build("/home/main", "ap").navigation(); // 构建标准的路由请求,通过Uri直接解析 Uri uri; ARouter.getInstance().build(uri).navigation(); // 构建标准的路由请求,startActivityForResult // navigation的第一个参数必须是Activity,第二个参数则是RequestCode ARouter.getInstance().build("/home/main", "ap").navigation(this, 5); // 直接传递Bundle Bundle params = new Bundle(); ARouter.getInstance()    .build("/home/main")    .with(params)    .navigation(); // 指定Flag ARouter.getInstance()    .build("/home/main")    .withFlags();    .navigation(); // 觉得接口不够多,可以直接拿出Bundle赋值 ARouter.getInstance()    .build("/home/main")    .getExtra(); // 使用绿色通道(跳过所有的拦截器) ARouter.getInstance().build("/home/main").greenChannal().navigation();

Gradle依赖

dependencies { apt 'com.alibaba:arouter-compiler:1.0.1' compile 'com.alibaba:arouter-api:1.0.2'}

关于如何搭建Alibaba-ARouter中的Android页面路由框架就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何搭建Alibaba-ARouter中的Android页面路由框架

本文链接: https://www.lsjlt.com/news/220164.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何搭建Alibaba-ARouter中的Android页面路由框架
    这篇文章将为大家详细讲解有关如何搭建Alibaba-ARouter中的Android页面路由框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。开发一款App,总会遇到各种各样的需求和业务,这...
    99+
    2023-05-30
    android alibaba arouter
  • Android路由框架ARouter的使用示例
    目录一、添加依赖和初始化框架 1、添加依赖 1.1、java版本的依赖1.2、kotlin版本的依赖2、初始化SDK二、ARouter的简单使用 1、界面跳转 1.1、Activit...
    99+
    2024-04-02
  • android中如何实现Router路由框架
    这篇文章主要为大家展示了“android中如何实现Router路由框架”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“android中如何实现Router路由框架”这篇文章吧。Router路由框架...
    99+
    2023-05-30
    android router
  • Android模块化框架如何搭建
    搭建Android模块化框架可以按照以下步骤进行:1. 创建一个新的Android项目:使用Android Studio创建一个新的...
    99+
    2023-10-11
    Android
  • 如何搭建Java中的SSM框架
    这篇文章主要介绍了如何搭建Java中的SSM框架,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装相关文件:MyEclipse界面:测试项目简单增删改:ssm+mysql+e...
    99+
    2023-05-30
    java ssm
  • vue的webpack框架如何搭建
    本篇内容主要讲解“vue的webpack框架如何搭建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue的webpack框架如何搭建”吧!1、想要使用vue,我首先该怎么做?想要学习vue,我第...
    99+
    2023-07-04
  • Nodejs如何封装类似express框架的路由
    这篇文章给大家分享的是有关Nodejs如何封装类似express框架的路由的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下var http=require(...
    99+
    2024-04-02
  • 如何在iframe框架中打开页面
    如何在iframe框架中打开页面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1:对于frameset对象。 (1)包含框架页的代码。 <frameset...
    99+
    2023-06-08
  • 如何搭建合适的Web框架
    如何搭建合适的Web框架,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。之前在Web开发框架推导一文中我们一步步的搭建了一个开发框架。在当时的情况下,还算满足需求。但是随着项...
    99+
    2023-06-16
  • AngularJS中如何重新加载当前路由页面
    这篇文章主要介绍了AngularJS中如何重新加载当前路由页面,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用angular做项目,会碰到需...
    99+
    2024-04-02
  • 如何进行SAP Hybris Commerce的页面路由实现
    今天就跟大家聊聊有关如何进行SAP Hybris Commerce的页面路由实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。登录Hybris前台,在product catalog里...
    99+
    2023-06-04
  • 如何解决angularjs中路由页面强制更新的问题
    这篇文章给大家分享的是有关如何解决angularjs中路由页面强制更新的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。有这么一个问题,在页面内路由页面跳转时,第一次跳入路由页...
    99+
    2024-04-02
  • vue多页面项目中路由如何使用history模式
    这篇文章给大家分享的是有关vue多页面项目中路由如何使用history模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何解决有一天看webpack文档的时候,突然看到了his...
    99+
    2024-04-02
  • vue3中addRoute路由变化但页面未更新如何解决
    解决办法,每次addRoute时 深复制组件对象import time from "../views/time" function copyObj(obj) { if (typeof obj == "o...
    99+
    2023-05-20
    Vue3 addroute
  • 如何搭建基于.NET平台的Web框架
    这篇文章主要介绍了如何搭建基于.NET平台的Web框架,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.技术分析1.web数据传输ExtJS作为前端UI展现层,传输数据格式为...
    99+
    2023-06-17
  • React中路由参数如何改变页面不刷新数据的情况
    目录React路由参数改变页面不刷新数据的情况React页面路由前端路由和后端路由前端路由介绍匹配模式路由的执行过程hash模式history模式react-router-dom A...
    99+
    2022-11-13
    React路由参数 React页面不刷新数据 React路由
  • Vue路由History mode模式中页面无法渲染如何解决
    本篇内容主要讲解“Vue路由History mode模式中页面无法渲染如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue路由History mode模式中页面无法渲染如何解决”吧!Vu...
    99+
    2023-07-04
  • vue-router是如何实现路由跳转和页面渲染的
    Vue-router是Vue.js官方的路由管理工具,支持基于Vue.js构建单页应用(SPA),它提供的路由功能让我们能够通过管理URL中的路径,来控制页面的跳转和展示。本文将着重探讨 Vue-router 的底层实现原理,分析 Vue-...
    99+
    2023-05-14
  • 项目实践:如何运用CSS框架快速搭建网页的经验总结
    项目实践:如何运用CSS框架快速搭建网页的经验总结在当今的互联网时代,网页已经成为我们日常生活和工作中不可或缺的一部分。而要快速、高效地搭建网页,CSS框架被广泛运用。本文将分享一些经验总结,帮助大家更好地运用CSS框架来快速搭建网页。一、...
    99+
    2023-11-02
    快速搭建 经验总结 CSS框架
  • 如何在 Windows 系统中快速搭建 Python 框架环境?
    Python 是一种高级编程语言,其简单易学、高效实用、可移植性强等特点,使其成为了众多编程语言中最流行的一种。但是,在 Windows 系统中搭建 Python 框架环境并不是一件容易的事情,这篇文章将会向您展示如何在 Windows 系...
    99+
    2023-07-24
    框架 shell windows
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作