Android:从零开始打造自己的深度链接库(一):ARouter简介

2024-06-04 16:48

本文主要是介绍Android:从零开始打造自己的深度链接库(一):ARouter简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

原计划这是一个系列的收费文章,2块钱买不了吃亏买不了上当,结果没想到预订人数还没到10人,略微有些尴尬。虽然结局不太完美,但是也反映出大家的水平大部分都在这篇文章的水平之上了,我也可以把文章拆分成多个部分慢慢写了,也是好事一件。

在应用开发中,原生app经常内嵌Web,节省开发的成本,这种情况我们通过注入JS脚本来解决原生和Web的通信问题。那么相反,在浏览器环境中,Web又如何启动App呢?这就是深度链接的出现的原因。

深度链接看着是一个很6的名字,实际上就是隐式启动的一种,所以说有文化就是不一样。隐式启动最大的优势在于不明确指定启动页面的名字,通过各种过滤参数,找到符合条件页面,对匹配的过程解耦,堪称路由模式的鼻祖。

我们谈谈什么是路由模式?
以生活中路由器为例,首先路由器连接可以访问网络的总线,我们通过网线或wifi连接路由器,当我们需要访问网络的时候,路由器帮助我们进行请求转发,访问网络有两种情况:
1、例如看视频,聊天等等,访问的是总线;
2、如果我们要打局域网游戏,就要访问连接同一路由的其他设备;

那么把这种设计理念放入到程序设计中:

总线 相当于主工程
设备 相当于独立模块

路由模式原型图

再说说程序设计模块化的几大好处:

1、便于多人协作开发,尽量避免多人操作同一文件,减少合并代码的引发的问题。
2、便于测试,减少打包测试的时间
3、便于维护,修改某一功能尽可能小的影响其他模块。

模块化有这么多的好处,但同时出现了一个更大的问题:

模块之间如何进行交互?

例如,用户登录和评论两个独立模块,评论之前需要判断是否已登录,否则要跳转到登录页面去,评论模块无法直接访问用户模块的类,所以无法正常编译运行,为了解决这个问题,我们需要借助路由模式。

OK,基本知识我们已经都了解了,接下来我们学习一下ARouter的用法,看看他怎么把路由和深度链接结合起来的。

正文

ARouter路由github地址

首先推荐大家看一下ARouter在github上的教程,英文版和中文版都有,可以说是非常良心了,这里我们挑几个重点介绍一下。

@Router注解

服务注解,用于Activity,Fragment,以及自定义服务接口等等。

@Router注解的类,代表可以被路由的服务,例如跳转页面,启动服务,或者开放服务,例如之前举例的登录,就可以写一个LoginService,然后通过路由地址就可以找到这个服务。

// 跳转页面
@Route(path = "/main/TestActivity", extras = 1)
public class TestActivity extends AppCompatActivity{}
ARouter.getInstance().build("/main/TestActivity").navigation();// 通过路由找到Fragment
@Route(path = "/test/fragment", extras = 1)
public class Fragment1 extends Fragment{}
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();// 通过路由找到开放的服务
@Route(path = "/service/sayHello")
public class HelloServiceImpl implements HelloService{}
HelloService service4 = (HelloService)ARouter.getInstance().build("/service/sayHello").navigation();

@Interceptor注解

全局拦截器注解,会在编译过程中自动装配到ARouter配置中,无需手动设置

拦截器会在路由过程中被执行,一旦某一个拦截器拦截,此次路由停止。如果跳转的过程想要跳过拦截器,可以设置greenChannel():

// greenChannel()表示跳过拦截器
ARouter.getInstance().build("/main/TestActivity").greenChannel().navigation();

@Autowired注解

自动装配注解,自动装配符合要求的值,例如从intent中或者通过路由创建对应的对象。

ARouter.getInstance().build("/kotlin/test").withString("name", "老王").withInt("age", 23).navigation();// 自动装配,desc属性表示的描述,没有实际作用
@Autowired(desc = "姓名")
String name = "jack";@Autowired
int age = 10;// 自动装配符合条件的服务
// 如果有多个实现类,请设置路由地址
// @Autowired(name = "/service/sayHello")
@Autowired
HelloService helloService;

SchemeFilterActivity的使用

深度链接过度页面,用于处理从浏览器跳转的参数,然后通过路由找到对应的服务。

SchemeFilterActivity需要在Manifest.xml中注册,这和我们之前了解的深度链接完全一样,得到了地址后,交给ARouter处理,这样深度链接就和路由完美结合在一起使用。

<activity android:name=".activity.SchameFilterActivity"><!-- Schame --><intent-filter><dataandroid: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>
</activity>public class SchemeFilterActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_schame_filter);Uri uri = getIntent().getData();ARouter.getInstance().build(uri).navigation();finish();}
}

总结

这一篇主要是了解一些路由和深度链接相关的知识,然后了解一下ARouter的用法,为之后的源码分析和实战打下基础。

下一篇:ARouter源分析,马上就来。

如果你突然觉得这个系列值两块钱,欢迎到简书打赏一下

这篇关于Android:从零开始打造自己的深度链接库(一):ARouter简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030567

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动