Android组件化demo实现以及遇坑分享
首先贴出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android组件化demo
作者:TenzLiu
原文链接:https://www.jianshu.com/p/416ca689ebc2
前言
前段时间看到最近一直很火的Android组件化然后就自己撸了一个demo,期间遇到了不少问题以及坑,在此记录一下,具体可以看项目源码。
组件化无非就是将我们App项目下的几个模块在com.android.application与com.android.library之间切换。如下图:分为modulelib(类库模块,一些基本工具类),modulemain(入口模块),moduleone(模块1),moduletwo(模块2),而App只是担当一个空壳工程。
1:新建一个Android项目,但是这个App只是一个空壳工程
2:接下来就是创建这几个module了,先都是以Android Library就行,然后就是在每个module的build.gradle下面修改
注意以为mudulelib只是作为一个根据库,所以不需要改,然后就是isModule从何而来,就是在整个项目的gradle.properties
3:App项目App以及各个module之间的一来关系:
首先modulelib是负责引用一些第三方类库以及一些基本代码的负责和一些工具类
App:
就是说当设置isModule=true的话各个模块处理modulelib都可以独立运行测试,也就是可以交给多人分开开发,最后只需要设置false就可以合并
各个模块的module:

在这里需要注意,modulelib的引用类库我们使用的是api,而不是implementation,因为implementation只能在本module有效,但是你去到如App那里就无效了;有一些类库引用是只有的比如butterknife:
implementation'com.jakewharton:butterknife:8.8.1'
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
implementation我们需要在modulelib里面,但是annotationProcessor却需要在各个module里面都要写上。
4:项目App怎么以modulemain为入口:
这里注意我们的App下面的minifest是没有activity的

而在modulemain的minifest下面有一个声明作为launcher的activity

这个程序已启动就会运行modulemain下面的MainActivity了。
5:各个module之间的交互怎么处理呢,比如一些activity的跳转,还有不同欧冠module之间获取fragment,这个上面也应该看到我是用的阿里的ARouter路由了,用法也很简单,官方链接:https://github.com/alibaba/ARouter。
如上面所说,在modulelib引用api'com.alibaba:arouter-api:1.3.1',然后在各个module下面annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
然后在各个模块的build.gradle下的defaultConfig下添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ]
}
}
这个官方文档有说明的。
然后就是使用了,在module需要跳转的activity或是需要获取的fragment设置
接下来就是跳转了,

至于fragment也是一样,

以及fragment的获取
6:在module里面的资源id在switch,case无法使用:
可以使用if,else代替

7:butterknife的使用问题
相信很多人都会用到butterknife注解,但是在module使用bb utterknife也会有坑,
如上面所说,在modulelib引用api'com.jakewharton:butterknife:8.5.1',然后在各个module下面annotationProcessor'com.jakewharton:butterknife-compiler:8.5.1'
在butterknife官方文档也有说明,如果是在module里面使用的话还要在各个module添加
applyplugin:'com.jakewharton.butterknife'
当然modulelib不需要,但是当你使用butterknife最新版8.8.1的时候就会因为这个报错,我也是在这里搞了很久马波的,原来是butterknife最新版不兼容的问题吧应该,只需要调低版本就好了,我这里是用了8.5.1
module使用butterknife还有一个R资源的问题,就是你butterknife注解使用的资源不能用R,而是要用butterknife提供的R2来寻找资源

8:之前说了每个module在设置isModule=true之后就可以单独运行调试了,那这个的monifest也需要有两套吧,

资源文件:

再来看看内容对比


剩下就撸码吧。
完~
作者:TenzLiu
原文链接:https://www.jianshu.com/p/416ca689ebc2
阅读更多
相信自己,没有做不到的,只有想不到的
在这里获得的不仅仅是技术!
Android组件化demo实现以及遇坑分享的更多相关文章
- Android组件化方案
Android组件化项目地址:Android组件化项目AndroidModulePattern Android组件化之终极方案地址:http://blog.csdn.net/guiying712/ar ...
- 从零开始搭建Android组件化框架
问题 在已经开发过几个项目的童鞋,如果这时需要重新开发一个新项目,是否需要自己重新搭建框架呢,还是从老项目中拷贝粘贴? 我们是否可以封装一个底层的lib库,这个底层的公共基础库 包括了一些第三方库(如 ...
- Android组件化之终极方案
Android组件化项目地址:Android组件化项目AndroidModulePattern Fragment或View如何支持组件化 如何管理组件 Fragment或View如何支持组件化 距离 ...
- 教你打造一个Android组件化开发框架
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 CC:Component Caller,一个android组件化开发框架, 已开源,github地址:https://github ...
- Android 组件化最佳实践 ARetrofit 原理
本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/TXFt7ymgQXLJyBOJL8F6xg作者:朱壹飞 ARetrofit 是一款针对Android ...
- Android组件化
附:Android组件化和插件化开发 App组件化与业务拆分那些事 Android项目架构之业务组件化 Android组件化核心之路由实现 Android组件化开发实践
- Android 组件化/模块化之路——在展示层搭建MVP结构
Android 组件化/模块化之路——在展示层搭建MVP结构 什么是MVP Model–View–Presenter (MVP) 源于 Model–View–Controller (MVC) 的结构设 ...
- Android组件化框架设计与实践
在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...
- 我所理解的Android组件化之通信机制
之前写过一篇关于Android组件化的文章,<Android组件化框架设计与实践>,之前没看过的小伙伴可以先点击阅读.那篇文章是从实战中进行总结得来,是公司的一个真实项目进行组件化架构改造 ...
随机推荐
- ASP.NET MVC之视图传参到控制器的几种形式
1. 传递数组 $(function () { var value = ["C#", "JAVA", "PHP"]; $("inp ...
- C# EF框架调用数据库的函数
1.在数据库中创建一个自定义函数: REATE FUNCTION [dbo].[f_IsOriginsDisabled] ( ), @needPPTV bit ) RETURNS bit AS BEG ...
- c# 适配器批量修改
DataTable dt; //在方法外部申明数据表SqlDataAdapter adapter; //在方法外部申明数据适配器 查询方法adapter = new SqlDataAdapter(Sq ...
- luogu P3240 [HNOI2015]实验比较
传送门 首先根据题目条件,题目中如果是=的点可以缩起来,然后\(a<b\)连边\(a\rightarrow b\),而且所有点入度为最多1,那么判掉有环的不合法情况,题目中的依赖关系就是一颗外向 ...
- Python之List列表的增删改查
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...
- Spring中@Transactional(rollbackFor = Exception.class)的作用
Spring中的@Transactional(rollbackFor = Exception.class)事务处理,当你的方法中抛出异常时,它会将 事务回滚,数据库中的数据将不会改变,也就是回到进入此 ...
- 基于【字符】操作的IO接口:Writer、Reader
Reader public class BufferedReaderTest { public static void main(String[] args) throws IOException { ...
- Spring Data
官网地址 http://projects.spring.io/spring-data 包含子项目 简介 Spring Data 是 Spring 的一个子项目.用于简化数据库访问,支持NoSQL,关系 ...
- VGGNet学习——实践
0 - DataSet http://www.csc.kth.se/~att/Site/Animals.html 1 - Code 1.1 - Import Packages import tenso ...
- const的引用
const的引用 对常量的引用:把引用绑定到const对象上,就像绑定到其他对象上一样,不能被用作修改它所绑定的对象: ; const int &r1 = ci;//正确:引用及其对应的对象都 ...