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

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


我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习的交流。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!


这个章节说的是两个木有直接互相依赖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代码速度的优化。


*****2017.3.3*****

QQ群里有同学提到了,倘若移除Activity所在整个module了,使用隐式intent,会抛出异常崩溃的问题。

同学在官网查看了之后

官网也提供判断例子

添加判断

如果使用隐式的地方多,你将会非常苦恼。


***2017.3.31*

今天踩到一个坑,如果最终生成app的那个module(例如广告页),你没有将将其依赖于主功能module,你会发现,你startActivity隐式跳转到页面的时候,会发现找不到相应的Activity,因为生成app的module的AndroidManifest.xml没有将相关的信息编译进最终的AndroidManifest里面



也有同学提到如果使用隐式的intent将会非常不安全,其他App可以轻易启动我们的Activity。

那么其实可以使用exported=true,就可以禁用其他App启动。下面是官方解析。


下一节,

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

更多相关文章

  1. Android(安卓)获取内存信息(RAM,ROM)
  2. 获取Android设备唯一标识码以及其他信息
  3. Android: SQLite + ListView 实现 新闻 App
  4. 常见ACTION的用法
  5. 优化Android(安卓)App启动白屏
  6. 【Android信息安防】三星KNOX容器(2)
  7. activity 的属性android:taskAffinity和android:allowTask
  8. 关于多设备登录的思考与实现
  9. 如何分析和研究Log文件(转)

随机推荐

  1. 无法使用php连接到mysql
  2. 使用格式化输出自动扩展Python列表
  3. 在SQL中声明@变量返回错误
  4. 从Node.js上的mysql结果JSON获取一个Arra
  5. Windows系统下MySQL解压版添加到系统服务
  6. 【MySQL 技巧分享】 mysql -e 加 v 简化
  7. MySQL索引之B+树
  8. 【PHP】当mysql遇上PHP
  9. phpMyAdmin 尝试连接到 MySQL 服务器,但服
  10. mysql 5.7.14 免安装配置方法教程