Android的路由框架用法,掌握这十个搜索技巧让你的工作效率至上提高十倍

  1. H5打开链接在所有平台都一样,方便统一跳转

  2. 打开某个APP,如果APP存在就直接打开,不存在就去下载页面下载

三、为什么需要路由框架?

Android原生系统已经给我们提供了AndroidManifest去管理页面跳转,比如startActivity,为什么还需要使用路由框架呢?我们来简单分析下路由框架存在的意义:

  1. 显示Intent:项目庞大以后,类依赖耦合太大,不适合组件化拆分

  2. 隐式Intent:协作开发困难,调用的时候不知道调什么参数

  3. 每个注册了Scheme的Activity都可以直接打开,有安全风险

  4. AndroidMainfest集中式管理比较臃肿

  5. 无法动态修改路由,如果页面出错,无法动态降级

  6. 无法动态拦截跳转,例如未登录的情况下,打开登录页面,登录成功后接着打开刚才想打开的页面

  7. H5、Android、iOS地址不一样,不利于统一跳转

  8. 在一些复杂的业务场景下(比如电商),灵活性比较强,很多功能都是运营人员动态配置的,比如下发一个活动页面,我们事先并不知道具体的目标页面,但如果事先做了约定,提前做好页面映射,便可以自由配置。

  9. 简化代码,数行跳转代码精简成一行代码,这个大家应该都很容易理解,无非就是对代码块的封装。

四、选择怎么样的路由框架比较好?

路由说到底还是为了解决开发者遇到的各种奇葩需求,选择路由框架要求使用简单、侵入性低、维护方便是首要条件,不影响你原来的代码,写入代码越少越好,这里推荐使用ARouter路由框架。

ARouter是阿里巴巴开源的Android平台中对页面、服务提供路由功能的中间件,一个用于帮助 Android App 进行组件化改造的框架,支持模块间的路由、通信、解耦,提倡的是简单且够用。

GitHub地址:https://github.com/alibaba/ARouter

ARouter的优势:

  1. 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中

  2. 支持多模块工程使用

  3. 支持添加多个拦截器,自定义拦截顺序

  4. 支持依赖注入,可单独作为依赖注入框架使用

  5. 支持InstantRun

  6. 支持MultiDex(Google方案)

  7. 映射关系按组分类、多级管理,按需初始化

  8. 支持用户指定全局降级与局部降级策略

  9. 页面、拦截器、服务等组件均自动注册到框架

  10. 支持多种方式配置转场动画

  11. 支持获取Fragment

  12. 完全支持Kotlin以及混编(配置见文末 其他#5)

  13. 支持第三方 App 加固(使用 arouter-register 实现自动注册)

  14. 支持生成路由文档

  15. 提供 IDE 插件便捷的关联路径和目标类

  16. 支持增量编译(开启文档生成后无法增量编译)

ARouter的典型应用:

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

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

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

  4. 跨模块API调用,通过控制反转来做组件解耦

五、ARouter的使用示例:

第一步:ARouter配置(添加依赖,引入类库)

打开build.gradle文件,在dependencies {}配置项里引入ARouter的远程类库(不懂的可以参考github上的官方说明),代码如下:

android {

defaultConfig {

//前面的代码省略…

javaCompileOptions {

annotationProcessorOptions {

arguments = [AROUTER_MODULE_NAME: project.getName()]

}

}

}

}

dependencies {

implementation ‘com.alibaba:arouter-api:1.5.1’

annotationProcessor ‘com.alibaba:arouter-compiler:1.5.1’

}

注意:

1、如果是组件化开发,那么所有的module组件(包括主项目和library项目**)**的build.gradle都要添加如上的依赖配置,如果只是加在公共的common组件里,是完全不起作用的。

2、api 的版本和 compiler 的版本号需要用最新的,最新的版本在官方的Github上可以看到,如下图:

第二步:添加ARouter路由注解(可选)

**

  • 在支持路由的页面上添加注解(必选)

  • 注意:这里的路径需至少需要有两级,/xx/xx

*/

@Route(path = “/test/RouteActivity”)

public class RouteDemoActivity extends AppCompatActivity {

//省略这里的代码…

}

上面的代码就是在目标Activity类上面声明Route path 注解,以此对应,跳转如果不对应路径,框架会Toast说路径不匹配。

第三步:ARouter初始化

方建议我们在Application里面进行ARouter初始化,因此需要创建一个自定义的Application,看下面的步骤:

1、在Activity同级包里,创建一个新的类RouteApplication.java继承Application,代码如下:

import android.app.Application;

import com.alibaba.android.arouter.launcher.ARouter;

/**

  • @author 安阳 QQ:15577969

  • @version 1.0

  • @team 美奇软件开发工作室

  • @date 2020/11/14 14:56

*/

public class RouteApplication extends Application {

//ARouter调用开关

private boolean isDebugARouter=true;

@Override

public void onCreate() {

super.onCreate();

if (isDebugARouter) {

// 打印日志

ARouter.openLog();

// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)

ARouter.openDebug();

}

ARouter.init(this);

}

}

2、在AndroidManifest.xml清单配置文件,中加入android:name=“RouteApplication”

<application

android:name=“RouteApplication”

android:allowBackup=“true”

android:icon=“@mipmap/ic_launcher”

android:label=“@string/app_name”

android:roundIcon=“@mipmap/ic_launcher_round”

android:supportsRtl=“true”

android:theme=“@style/AppTheme”>

第四步:发起路由操作

//应用内简单的跳转(通过URL跳转在’进阶用法’中)

ARouter.getInstance().build(“/test/RouteActivity”).navigation();

六、监听路由过程

ARouter.getInstance().build(“/test/RouteActivity”).navigation(this, new NavCallback() {

@Override

public void onFound(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 找到了路由”);

}

@Override

public void onLost(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 找不到路由”);

}

@Override

public void onArrival(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 路由跳转完成”);

}

@Override

public void onInterrupt(Postcard postcard) {

Log.e(“监听路由过程”, “onArrival: 路由被拦截了”);

}

});

七、发起路由并且传递参数

// 跳转并携带参数

ARouter.getInstance().build(“/test/RouteActivity”)

.withLong(“id”, 1)

.withString(“name”, “张三”)

.withObject(“obj”, this)

.navigation();

ARouter 提供了大量的参数类型,如下所示:

//基础类型

.withString( String key, String value )

.withBoolean( String key, boolean value)

.withChar( String key, char value )

.withShort( String key, short value)

.withInt( String key, int value)

.withLong( String key, long value)

.withDouble( String key, double value)

.withByte( String key, byte value)

.withFloat( String key, float value)

.withCharSequence( String key, CharSequence value)

//数组类型

.withParcelableArrayList( String key, ArrayList<? extends Parcelable > value)

.withStringArrayList( String key, ArrayList value)

.withIntegerArrayList( String key, ArrayList value)

.withSparseParcelableArray( String key, SparseArray<? extends Parcelable> value)

.withCharSequenceArrayList( String key, ArrayList value)

.withShortArray( String key, short[] value)

.withCharArray( String key, char[] value)

.withFloatArray( String key, float[] value)

.withCharSequenceArray( String key, CharSequence[] value)

//Bundle 类型

.with( Bundle bundle )

//Activity 跳转动画

.withTransition(int enterAnim, int exitAnim)

//其他类型

.withParcelable( String key, Parcelable value)

.withParcelableArray( String key, Parcelable[] value)

.withSerializable( String key, Serializable value)

.withByteArray( String key, byte[] value)

.withTransition(int enterAnim, int exitAnim)

八、路由分组

什么是路由分组?

ARouter框架是分组管理,按需加载。在编译期框架扫描了所有的注册页面/服务/字段/拦截器等,那么很明显运行期不可能一股脑全部加载进来,这样就太不和谐了。所以就分组来管理,ARouter在初始化的时候只会一次性地加载所有的root结点,而不会加载任何一个Group结点,这样就会极大地降低初始化时加载结点的数量。比如某些Activity分成一组,组名就叫demo,然后在第一次需要加载组内的某个页面时再将demo这个组加载进来。

@Route(path = “/test/RouteActivity”)

上面这行代码,就是我们前面添加的路由注释,最前面的demo就是路由分组。我们还可以在监控路由过程里,获取所在的分组,代码如下:

ARouter.getInstance().build(“/test/RouteActivity”).navigation(this, new NavCallback() {

@Override

public void onArrival(Postcard postcard) {

String group = postcard.getGroup();

Log.e(“监听路由过程”, "当前路由分组是: " + group);

}

});

运行结果如下:

九、自定义路由分组

1、在原来的注解上添加group字段

**

  • 添加路由和分组

*/

@Route(path = “/test/RouteActivity”, group = “testGroup”)

public class RouteDemoActivity extends AppCompatActivity {

//省略这里的代码…

}

2、发起路由时,第二个参数填写路由的分组

build(String path, String group)

具体示例代码如下:

// 应用内简单的跳转(通过URL跳转在’进阶用法’中)

ARouter.getInstance().build(“/test/RouteActivity”,“testGroup”).navigation();

3、添加自定义分组后,运行结果如下:

十、Fragment路由

创建 Fragment 类,并且添加路由注解,如下:

/**

  • 添加Fragment碎片路由

*/

@Route(path = “/test/ModuleFragment”)

public class ModuleCFragment extends Fragment {

//省略这里的代码…

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

  • Android进阶学习全套手册
    关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。

  • Android高级架构师进阶知识体系图
    关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!

  • Android对标阿里P7学习视频

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

图片转存中…(img-C9dxmMxZ-1712122101863)]

  • Android对标阿里P7学习视频

[外链图片转存中…(img-UahDpTtM-1712122101863)]

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
    [外链图片转存中…(img-lDZhKiVV-1712122101864)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值