Navigation框架自定义路由库强行组件化的可行性分析

答案:

不可以

文章前提:

  • 熟悉并理解阿里巴巴ARouter框架源码
  • 熟悉Navigation框架组件化(官网的方式)

如果你不熟悉,我建议看两个文章:

官网navigation多模块化,(官方的组件化只能在主模块使用deeplink使用fragment)

后面我会出一篇路由库的解析,并奉上源码地址。

开始:

官网的多模块方式我就不讲了,只能在主模块引用,相当于没有用。

我们需要知道几个问题的答案:

这里我们将阿里的ARouter作为路由库的例子:

1. 我们为什么需要路由库?

很简单,我们想要在业务模块a 里引用业务模块b 的activity,但是我们不能让模块a 直接依赖**模块b,**因为这样是违反组件化原则的,因此我们需要通过别的方式拿到这个activity。

简单说一下原则:

  1. 解耦和模块化:业务模块之间的相互依赖会增加耦合性,使得模块之间的关系变得复杂。如果一个模块发生变化,可能会影响到其他模块,导致代码难以维护和理解。通过减少模块之间的依赖,可以更好地实现解耦和模块化,使得各个模块更加独立和可重用。

  2. 可维护性和可扩展性:业务模块之间的相互依赖会增加代码的复杂性,降低代码的可维护性和可扩展性。当一个模块依赖于其他模块时,它就会受制于其他模块的变化,从而增加了维护的难度。通过减少模块之间的依赖,可以降低代码的复杂性,提高代码的可维护性和可扩展性。

  3. 灵活性和可测试性:业务模块之间的相互依赖会影响代码的灵活性和可测试性。如果一个模块依赖于其他模块,那么在测试时就需要同时考虑这些依赖关系,增加了测试的复杂性。通过减少模块之间的依赖,可以提高代码的灵活性和可测试性,使得代码更容易编写和测试。

2.我们可以通过什么方式拿到这个activity ...?

少说有五种:

  • eventbus
    太乱了。
  • 广播
    难以管理
  • 类加载模式:直接使用活动的全类名字:

    维护起来太麻烦,修改一个文件夹,就要在所有引用过的地方修改
  • 使用隐式意图的方式:
    在activity中定义意图过滤器,需要这个意图唯一,如果活动多了,就不好管理了。
  • 使用全局Map的方式:
    这个网上有,应该是比较简单的,在common里定义个baseApplication,然后定义application的代理接口,用一下反射应该就好了。把这个Map放在common里面。
    缺点:注册的活动多了,就不好了

注意这个全局Map的思想!

我们如果可以在全局持有所有activity的全类名,再结合第三种方法(类加载模式),不就可以随意跳转了吗?

对,这就是ARouter的核心思想!

3.ARouter的实现原理:

通过注解处理器,对有我们自定义注解的activity,生成类,

这个类的执行的就是map的put方法!红色框框圈出来的是一个接口,在使用反射的时候,我们的生成类肯定是不一样的,所以在调用的时候就要强转成同一个类型,就是IRootGroup

在app启动的时候,通过反射调用put方法,把所有的路径都放在一个map里面管理起来。

你想要启动哪一个activity的时候,就会通过类加载模式进行跳转,也就是startActivity()

结合navigation框架

为什么我说navigatin框架不可以?

因为在navigation框架中,即使你已经拥有了想要跳转graph的id,但是这个id必须出现在调用这个方法的模块的graph文件里面,并且配合action,但是我们是多模块化,所以没办法引用这个action,不然我们不就直接可以调用了吗?

有一位大哥给navigation框架写了个Router,但是在那个版本的navigation是可以的,现在好像不行了。。。我不太确定

这是那位大哥的项目地址

各位大哥要是有了思路,欢迎在下方评论。

相关推荐
好家伙VCC15 小时前
# ARCore+ Kotlin 实战:打造沉浸式增强现实交互应用在
java·python·kotlin·ar·交互
EQ-雪梨蛋花汤15 小时前
【笔记】安卓毛玻璃效果(Blur)实现笔记(使用BlurView)(结尾附:源码)
android·笔记
zore_c15 小时前
【C++】C++——类的默认成员函数(构造、析构、拷贝构造函数)
java·c语言·c++·笔记·算法·排序算法
我登哥MVP15 小时前
【SpringMVC笔记】 - 4 - 三个域对象
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
Seven9715 小时前
【从0到1构建一个ClaudeAgent】协作-Agent团队
java
郝学胜-神的一滴15 小时前
[系统设计] 新鲜事系统:写扩散与读扩散的实现与对比
java·设计模式·php·软件构建·需求分析·软件设计·系统设计
疯狂成瘾者16 小时前
LangChain4j ApacheTikaDocumentParser:多格式文档接入的统一入
java·langchain4j
StackNoOverflow17 小时前
MySQL Explain 返回列详解:从入门到实战,附 SQL 与避坑大全
android
庞轩px17 小时前
第三篇:泛型深度解析——类型擦除与通配符的奥秘
java·编译·泛型·类型擦除
HoneyMoose1 天前
Jenkins Cloudflare 部署提示错误
java·servlet·jenkins