Android 组件化
来源:互联网 发布:it之家官网 编辑:程序博客网 时间:2024/05/18 20:05
随着时间的推移,项目变得越来越臃肿,随便修改一些东西,重新编译一次,也要几分钟,极大影响开发效率。
故在一个月前,决定引入组件化,来缓解这种情况。
先对组件化的优势和主要的问题做下记录。
Router框架
Intent intent = new Intent(mContext, XxxActivity.class);intent.putExtra("key","value"); startActivity(intent);
在Android开发中,是最常用的功能就是页面的跳转,先排除从浏览器或者其他App跳转到自己App中页面的需求,仅仅是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:
- 集中式的URL管理
- 谈到集中式的管理,总是比较蛋疼,多人协同开发的时候,大家都去AndroidManifest.xml中定义各种IntentFilter,使用隐式Intent,最终发现AndroidManifest.xml中充斥着各种Schame,各种Path,需要经常解决Path重叠覆盖、过多的Activity被导出,引发安全风险等问题
- 可配置性较差
- Manifest限制于xml格式,书写麻烦,配置复杂,可以自定义的东西也较少
- 跳转过程中无法插手
- 直接通过Intent的方式跳转,跳转过程开发者无法干预,一些面向切面的事情难以实施,比方说登录、埋点这种非常通用的逻辑,在每个子页面中判断又很不合理,毕竟activity已经实例化了
- 跨模块无法显式依赖
- 在App小有规模的时候,我们会对App做水平拆分,按照业务拆分成多个子模块,之间完全解耦,通过打包流程控制App功能,这样方便应对大团队多人协作,互相逻辑不干扰,这时候只能依赖隐式Intent跳转,书写麻烦,成功与否难以控制。
而Router框架很好地解决了以上问题,比如ARouter。
ARouter路由框架
- 支持通过URL进行跳转,并自动注入参数到目标页面
- 支持多模块工程使用
- 支持添加多个拦截器,自定义拦截顺序
- 支持依赖注入,可单独作为依赖注入框架使用
- 等等…
详见 传送门
组件化
随着时间的推移,项目变得越来越臃肿,随便修改一些东西,重新编译一次,也要几分钟,极大影响开发效率。
使用组件化可实现
- 模块间进一步解耦,所有的基础公共库按需进行依赖,各个项目可共用
- 开发阶段仅对单个模块进行运行和调试,提高开发效率
- 减少协同开发中的冲突,提高开发效率
- 可自由选择开发姿势(MVC/MVP/MVVM等)
- 可进行针对性的的测试(仅需对修改过的模块进行测试)
- 实现各模块的配置和组装,当一个功能不需要的时候,随时可去掉,当又需要该功能的时候,随时又可加上。
而使用Router框架是实现组件化的一个很好的方式。
公司项目组件
最终,把公司项目拆分为如下结构,各个业务模块之间可以独立运行,亦可组合在一起打Release包。
使用组件化的注意事项
Debug和Release模式下,Manifest不同
使用两个Manifest,在Debug模式下,使用Debug路径下的Manifest,Release模式下,使用Release的manifest。
在Module的gradle文件中,进行配置
sourceSets { main { if (rootProject.ext.is_build_module) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' java.srcDirs += "src/main/debug/java/"; } else { manifest.srcFile 'src/main/release/AndroidManifest.xml' java.srcDirs += "src/main/release/java/"; } } }
资源ID冲突
合并多个组件到主程序,资源名相同时,会引起资源冲突。比较简单的解决方式是通过配置资源前缀名resourcePrefix来避免。配置了resourcePrefix后,该组件所有的资源都需要添加这个前缀才能编译通过。(但是 resourcePrefix 这个值只能限定 xml 里面的资源,并不能限定图片资源,所有图片资源仍然需要你手动去修改资源名)
android { resourcePrefix "news_"}
初始化
Debug模式下,可以配置组件自己的Application,进行初始化一些类库,但是在Release模式下,就无法做到一个组件一个Application了,一个较好的解决方案是使用ARouter的拦截器,ARouter拦截器的init方法,会在程序启动的时候,进行调用,并且会传入Context对象。
@Interceptor(priority = 8)public class TestInterceptor implements IInterceptor { @Override public void init(Context context) { }}
Demo程序
ModularizationTest
- android组件化
- Android组件化实战
- Android 组件化开发
- Android 组件化案例
- android项目组件化
- android组件化思考
- Android组件化方案
- android 组件化开发
- Android 组件化
- Android组件化项目
- android组件化方案
- Android组件化方案
- Android组件化实践
- Android 组件化
- Android组件化开发
- Android组件化
- Android 组件化 构架
- Android 组件化
- 香港服务器的核心特点是什么
- Eclipse+Maven创建webapp项目
- POJ_2632
- maven项目pom.xml文件报错failOnMissingWebXml
- Command Network
- Android 组件化
- Angular中ng-controller父子级嵌套的相关属性
- UML用例图、类图、时序图
- # JSP入门知识点系列之一
- 分库分表带来的完整性和一致性问题
- 诉说站点优化之前一定要先分析用户的心里这样排名才能上来
- Linux中查看各文件夹大小命令du -h --max-depth=1
- 简单获取最近6个月的方法
- win10服务主机占用cpu使用率该怎么办?win10服务主机cpu高的处理方法