Android:从零开始打造自己的深度链接库(三):自定义XML协议

2024-06-04 16:48

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

前言

之前我们把ARouter的原理分析了一遍,如果你是刚启动的新项目,建议立刻使用,哪天运营有这个需求了,你就可以牛逼的对他说,我早就已经做好了。

但是老项目就会有一丢丢的尴尬,所以我们要在ARouter的基础上,独立深度链接的功能,然后打造出加强版的深度链接库,我起名为DeepLinkSo。

正文

回顾一下ARouter的源码,我们记得他使用的是自定义注解,完成路由的注册和绑定。注解看上去高大上,但是在这里我认为存在一个致命的短板,那就是不够灵活

注解的局限性

注解的解析是在编译期间完成并生成源码,也就是说版本一经发布,注册的路由地址就无法发生改变,例如

1、 开启新的路由。例如个人信息页我们并没有配置路由,我们就无法通过深度链接打开这个网页,只能修改代码,然后重新发布版本解决这个问题。
2、关闭某个路由,因为某些原因某个页面要停止外部访问,也只能修改代码,然后重新发布版本。

所以几经思考,如果路由的配置文件能够从网上下载更新的话,是不是就能让深度链接更佳灵活呢?

于是我选择了使用XML。
使用注解可以在编译期间生成源码,节省了启动时间,但是牺牲了灵活性。
使用XML恰恰相反,没有增加编译时间,而是增加了启动时间,但是我们的XML还是很小的,经过测试也就10毫秒左右,还在可以接受的范围内。

自定义XML协议

XML协议无论在前端后端都被广泛的使用,而且Android对XML解析的有很好的支持,复习一下XML解析的三种方式:

1、SAX解析
2、Pull解析(推荐)
3、Dom解析

Android推荐使用Pull解析,轻量快速,所以我们也选择使用Pull解析。

首先制定好我们的XML格式:

<?xml version="1.0" encoding="utf-8"?>
<DeepLinkSo><!-- 版本号 --><version value="1" /><!-- 拦截器会按照配置的顺序依次执行 --><common-interceptors><common-interceptor>com.lzp.deeplinkso.demo.interceptor.TestInterceptor</common-interceptor></common-interceptors><!-- 所有需要支持DeepLink的文件列表 --><list><!-- 跳转的页面 --><Activity><class>com.lzp.deeplinkso.demo.MainActivity</class><page>main</page></Activity><!-- 跳转的页面 --><Activity><class>com.lzp.deeplinkso.demo.TestActivity</class><page>test</page><!-- 需要的参数 --><params><key type="Long" value="userId" /><key value="userName" /></params><!-- 是否跳过公共Interceptor --><skipCommonInterceptor>true</skipCommonInterceptor><!-- 私有拦截器 --><!--<interceptors>--><!--<interceptor>com.lzp.deeplinkso.demo.interceptor.TestInterceptor</interceptor>--><!--</interceptors>--></Activity><!-- 自定义事件 --><Event><class>com.lzp.deeplinkso.demo.handler.TestEventHandler</class><page>event</page><params><key value="eventId" /></params></Event></list></DeepLinkSo>

我们在XML制定了以下内容:

1、版本号。可以根据降级和升级做一些操作。
2、全局拦截器。所有的跳转都会经过拦截处理,我们可以在跳转中设置跳过全局拦截器。
3、跳转的页面。可以设置对应的路由地址,跳转的参数,私有拦截器等。
4、自定义事件。设置和页面是一样的,只是不跳转页面。

这样我们的功能已经算是很全面了,接下来我们可以通过解析XML,保存所有的配置信息:

class DeepLinkSoConfig {/*** 当前版本号**  无实际作用,仅仅是为了区别xml的版本* */private var version = "0"internal var listener: IDeepLinkSoListener? = null/*** 保存跳转Activity配置项* */private val activityOptionMap = HashMap<String, DeepLinkSoActivityOption>()/*** 保存自定义事件配置项* */private val eventOptionMap = HashMap<String, DeepLinkSoEventOption>()/*** 自定义拦截器* */internal var interceptors: ArrayList<IDeepLinkSoInterceptor>? = nullinternal fun setVersionCode(version: String) {this.version = version}fun getVersionCode() = this.version/***  添加配置项* */internal fun addOption(key: String, option: DeepLinkSoOption) {when (option) {is DeepLinkSoActivityOption -> activityOptionMap[key] = optionis DeepLinkSoEventOption -> eventOptionMap[key] = option}}/***  添加配置项* */internal fun getOption(key: String): DeepLinkSoOption? {return activityOptionMap[key] ?: eventOptionMap[key]}/***  获取Activity配置项* */internal fun getActivityOption(key: String) = activityOptionMap[key]/***  获取Event配置项* */internal fun getEventOption(key: String) = eventOptionMap[key]/*** 清除配置项* */internal fun reset() {activityOptionMap.clear()eventOptionMap.clear()interceptors?.clear()}}

解析的过程就不贴了,到此为止,我们已经为具体的开发做好了准备。

总结

今天我们分析了并制定了深度链接库的XML协议,思考了使用注解和XML的优劣点,为之后的功能开发做好准备。

下一篇:Android:从零开始打造自己的深度链接库(四):DeepLinkSo实战

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



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

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam