前言
1、主动学习,努力提升,与社会发展同行
在职场上工作的年限越长,就越容易形成定势思维,这也许就是思维僵势的影响。这种习惯性思维正是缩小中年人生存空间的一大原因。
随着新行业、新技术的出现,要想不被社会淘汰,就必须具备迭代思维,主动突破思维惰性,接受新知识,让自己远离职场“老油条”的称号。这种努力付出只会让你的路越走越宽。
2、融入圈子,建立人脉资源
人想要提升自己,就要逼迫自己融入想要进入的圈子,这样你才能认识不同的人,建立自己想要的人脉资源。
3、提高自律,拥有健康
健康是革命的本钱。很多成功人士都明白健康的重要性,所以不管自己多忙,都会不忘记健身。马云天天打太极、王石每天跑步。
虽然你现在已经35岁或正在向35岁走来,但只要你不自我放,坚持做好这三件事,相信你不会遇到所谓的中年危机,更不会找不到工作。
组件化
1.1 组件化初衷
- APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,维护成本高。
- 业务耦合度高,代码越来越臃肿,团队内部多人协作开发困难。
- Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。
- 方便单元测试,改动单独一个业务模块,不需要着重于关注其他模块被影响。
1.2 什么是组件化
组件化就是将一个app分成多个Module,如下图,每个Module都是一个组件(也可以是一个基础库供组件依赖),开发的过程中我们可以单独调试部分组件,组件间不需要互相依赖,但可以相互调用,最终发布的时候所有组件以lib的形式被主app工程依赖并打包成一个apk。
1.3 组件化优势
- 组件化就是将通用模块独立出来,统一管理,以提高复用,将页面拆分为粒度更小的组件,组件内部除了包含UI实现,还包含数据层和逻辑层。
- 每个工程都可以独立编译、加快编译速度,独立打包。
- 每个工程内部的修改,不会影响其他工程。
- 业务库工程可以快速拆分出来,集成到其他App中。
- 迭代频繁的业务模块采用组件方式,业务线研发可以互不干扰、提升协作效率,并控制产品质量,加强稳定性。
- 并行开发,团队成员只关注自己的开发的小模块,降低耦合性,后期维护方便等。
2 组件化通信
2.1 组件化通信
组件化互相不直接依赖,如果组件A想调用组件B的方法是不行的。很多开发者因为组件化之间通信比较复杂 则放弃了组件化的使用
组件通信有以下几种方式:
####### 1.本地广播
本地广播,也就是LoacalBroadcastRecevier。更多是用在同一个应用内的不同系统规定的组件进行通信,好处在于:发送的广播只会在自己的APP内传播,不会泄漏给其他的APP,其他APP无法向自己的APP发送广播,不用被其他APP干扰。本地广播好比对讲通信,成本低,效率高,但有个缺点就是两者通信机制全部委托与系统负责,我们无法干预传输途中的任何步骤,不可控制,一般在组件化通信过程中采用比例不高。
2.进程间的AIDL
进程间的AIDL。这个粒度在于进程,而我们组件化通信过程往往是在线程中,况且AIDL通信也是属于系统级通信,底层以Binder机制,虽说Android提供模板供我们实现,但往往使用者不好理解,交互比较复杂,往往也不适用应用于组件化通信过程中。
3.匿名的内存共享
匿名的内存共享。比如用Sharedpreferences,在处于多线程场景下,往往会线程不安全,这种更多是存储一一些变化很少的信息,比如说组件里的配置信息等等
4.Intent Bundle传递
Intent Bundle传递。包括显性和隐性传递,显性传递需要明确包名路径,组件与组件往往是需要互相依赖,这背离组件化中SOP(关注点分离原则),如果走隐性的话,不仅包名路径不能重复,需要定义一套规则,只有一个包名路径出错,排查起来也稍显麻烦,这个方式往往在组件间内部传递会比较合适,组件外与其他组件打交道则使用场景不多。
2.2 目前主流做法之一就是引入第三者,比如图中的Base Module。
3 ARouter组件通信框架
3.1 ARouter 简介
是ARouter是阿里巴巴开源的Android平台中对页面、服务提供路由功能的中间件,提倡的是简单且够用。主要用作组件化通信
Intent intent = new Intent(mContext, XxxActivity.class);
intent.putExtra("key","value");
startActivity(intent);
Intent intent = new Intent(mContext, XxxActivity.class);
intent.putExtra("key","value");
startActivityForResult(intent, 666);
上面一段代码,在Android开发中,最常见也是最常用的功能就是页面的跳转,我们经常需要面对从浏览器或者其他App跳转到自己App中页面的需求,不过就算是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:
-
集中式的URL管理:谈到集中式的管理,总是比较蛋疼,多人协同开发的时候,大家都去AndroidManifest.xml中定义各种IntentFilter,使用隐式Intent,最终发现AndroidManifest.xml中充斥着各种Schame,各种Path,需要经常解决Path重叠覆盖、过多的Activity被导出,引发安全风险等问题
-
可配置性较差:Manifest限制于xml格式,书写麻烦,配置复杂,可以自定义的东西也较少
-
跳转过程中无法插手:直接通过Intent的方式跳转,跳转过程开发者无法干预,一些面向切面的事情难以实施,比方说登录、埋点这种非常通用的逻辑,在每个子页面中判断又很不合理,毕竟activity已经实例化了
-
跨模块无法显式依赖:在App小有规模的时候,我们会对App做水平拆分,按照业务拆分成多个子模块,之间完全解耦,通过打包流程控制App功能,这样方便应对大团队多人协作,互相逻辑不干扰,这时候只能依赖隐式Intent跳转,书写麻烦,成功与否难以控制。
为了解决以上问题,我们需要一款能够解耦、简单、功能多、定制性较强、支持拦截逻辑的路由组件:我们选择了Alibaba的ARouter,偷个懒,直接贴ARouter的中文介绍文档:
3.2 ARouter 优势
从 ARouter Github 了解到它的优势:
支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支持MultiDex(Google方案) 映射关系按组分类、多级管理,按需初始化 支持用户指定全局降级与局部降级策略 页面、拦截器、服务等组件均自动注册到框架 支持多种方式配置转场动画 支持获取Fragment 完全支持Kotlin以及混编 典型的应用:
从外部URL映射到内部页面,以及参数传递与解析 跨模块页面跳转,模块间解耦 拦截跳转过程,处理登陆、埋点等逻辑
跨模块API调用,通过控制反转来做组件解耦
三、典型应用场景
- 从外部URL映射到内部页面,以及参数传递与解析
- 跨模块页面跳转,模块间解耦
- 拦截跳转过程,处理登陆、埋点等逻辑
- 跨模块API调用,模块间解耦(注册ARouter服务的形式,通过接口互相调用)
题外话
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料免费分享出来。
【Android学习PDF+学习视频+面试文档+知识点笔记】
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
需要的朋友,可以点赞关注+转发”前往免费领取!
技能树)】**
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
[外链图片转存中…(img-pYzRGaUM-1620131591034)]
需要的朋友,可以点赞关注+转发”前往免费领取!
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~