[Android] 如何做一个崩溃率少于千分之三噶应用 app(12)-module 页面跳转

2,099 阅读5分钟

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表

这个章节说的是两个木有直接互相依赖module里面的Activity之间的跳转。

两个Actvity间跳转,是Android app研发的基础。我想问一下,你有想过不同的两个module两个activity怎样可以跳转呢?

首先,之前这个系列有介绍过,两个平级的功能module是不会互相依赖的,只依赖于一个base的module。那么两个平级的mdoule是不会产生相互依赖的。

一个Activity的创建,很基础是通过一个发送包装intent,然后通过startActivity去交给ActivityManagerService完成Activity创建。包装intent的时候你发觉引用不了其他module里面的包名,所以木有可以索引到activity的名字。

这里我们不能通过new来实例化Activity的,启动Activity的方法只有intent,你可以想到如何启动吗?给你一分钟的时间,思考,思考,思考。

好了,答案是使用隐式的intent,可以启动其他module的activity。隐式intent的用法相信网上也有很多相关的资料。通过setAction和intentFilter配合来启动其他的Activity。

(1)声明一个Activity,通过intent-filter来限定隐式启动的action。


(2)然后其他module就可以使用隐式的Action就可以启动相应的页面了。


当然这是最常规的方式。有人会问intent使用setClassName,或者setComponentName是否可以启动呢?虽然这两个都是可以启动其他第三方App的页面的方法。

如果你使用的intent的是这样的


你会发现系统压根就找寻不到这个地址里面BActivity。


为何会出现这样的情况呢?思考,思考,思考。

这里首先要想清楚,你们明白setClassName和setComponetName第一个参数需要填写的是什么?

这里需要填写的应该是包名,而不是module的名字。

可以看看我们基本的框架图


我们表现到Launcher桌面里面的应该是App这个module,虽然区分了众多的功能的module,但是最终众多的AndroidMainifest.xml,Android studio最终只会打包到成为一个AndroidMainifest.xml。

你可以查看这个地址AndroidMainifest.xml


你会发现其真正的包名应该是com.cangwang.modulebus的包名,就是app工程的包名。


那么我们只需要将包名换为这个就可以正常启动了。


setCallName


setComponent

说到这里,有些人会怀疑,这些都是基础。如果我不希望把我的Activity声明隐式的Activity。或者我不希望通过包名等这么低效的方式去完成跳转,我是否还有方法做跳转呢?思考,思考,思考。

答案是肯定有的。

有一部分人会可能会看过ActivityRouter,认为ActivityRouter可以做到。我在ActivityRouter的github例子里面,也只是看到一个主module调次module的Activity跳转,而且很明显这主module是依赖次module的。

试想一下,在哪里才能获取到全部的声明的Activity的信息呢?

刚刚的分析,就是让大家知道,在这种架构只有在主Module里面,才能获取到全部的资源信息。

那么我就用主module完全启动不就可以了,我其他功能module只需要告诉主module我需要启动什么东西和信息,然后用主module来启动相应的Activity。

(1)启动的时候发送到主Module上。


(2)然后在主module里面接入启动代码。


这种做法好处在于,

(1)启动Activity的入口都在主module里面,这样可以忽略包名,功能module是获取不到主module的包名的。

(2)统一管理启动的入口和返回的信息回调。

不好的地方在于,启动的时候,如果有返回的结果,需要通过主module再传递给启动的入口,这增加了逻辑的编写。

如果知道包名和类名的情况下,还是建议使用Activity的通常创建。

如果是想要统一管理创建信息和回调信息,那么就使用moduleBus将信息引入主module统一处理。

***思考了很久很久***

(1)想要简化module Activity的索引,想过使用编译时注解的方法用一个注解来编写一个java文件用记录静态变量来做Activity包名和类名的索引。如果想要功能模块可以获取这些索引,那么java的文件需要放在base的module里面。启动的时候却需要获取主module包名的地址。那么就需要在base 和主module获取信息,如果这样写,就会让使用者觉得非常麻烦。思考过程中,并木有地方可以同时获取到主module包名,base地址,还有启动每个module的Activity的地方。或许是我对构建的流程还不够了解。

如果思考到有好的注入的方式,也可以告诉我,我试着去实现,谢谢!

启动的实例已经编写到ModuleBus地址里面,有兴趣可查看一下。同时在这期间,我也增强了ModuleBus代码速度的优化。

下一节,

内容会更精彩,敬请期待!!!