Advertisement

手把手教你写Android项目文档,使用指南

阅读量:

前言

春季招聘活动即将结束,请问许多同学都在寻找理想的offer机会吗?作为一名被裁员的职场新人,在家期间我每天登录LeetCodeApp并完成了近800道习题,并凭借自己的工作经历积累的知识体系与实践经验进行了系统的梳理与总结。在五一假期期间我已经收到了字节跳动的 offer 通知哦!话不多说……下面开始分享我的刷题经验!

组件化

1.1 组件化初衷
  • APP版本持续更新频繁导致业务逐步升级与维护成本增加
  • 业务间相互依赖密切导致代码逐渐庞大且团队协作困难
  • Android项目在编译代码时电脑运行缓慢且耗时较长;由于单一工程下代码耦合严重导致每次修改都需要重新编译打包测试
  • 方便单元测试能够使改动仅限于单独一个业务模块无需担心其他模块受影响
1.2 什么是组件化

分模块化设计通常指的是将应用程序分解为若干个独立的模块,在开发过程中可以独立地对各个模块进行测试。各模块之间相互独立运行,并通过调用接口进行通信。如图所示,在开发完成后这些功能单元会被整合成一个可执行文件并作为库体提供给主程序使用。

1.3 组件化优势
  • 组件化通过将通用模块独立出来进行统一管理以提高其复用性,并将页面划分为更为细致的小组件;每个组件不仅包含了用户界面实现还整合了数据层和逻辑层。
  • 各工程均能独立完成编译任务从而提升运行效率并支持打包部署。
  • 各个工程之间相互独立互不影响。
  • 业务库项目能够方便地分离重组并成功整合至其他应用系统中。
  • 频繁迭代的业务线采用模块化设计以避免干扰促进协作同时保证产品质量稳定性和安全性。
  • 采用异步并行开发模式可使团队成员专注于各自的小模块从而降低系统耦合性简化后期维护流程。

2 组件化通信

2.1 组件化通信

组件之间相互独立不直接依赖关系。若要让组件A调用组件B的方法,则无法实现这一目标。由于大多数开发者在面对复杂的通信需求时会遇到技术上的困难,因此逐渐减少了对这种开发模式的采用。

组件通信有以下几种方式:

####### 1.本地广播

局部广播(LocalBroadcastReceiver),即本地广播接收器,在同一应用程序内部各组件之间的通信中广泛应用。其优势在于仅限于自身范围内的信息传播:一旦发送出去的信息仅限于该应用内部传播,并不会向外应用程序扩散;此外其他应用程序也无法向其本身的应用程序发射广播信号以干扰其正常运作;这种机制类似于个人对讲机的功能,在成本效益方面具有显著优势;然而其缺点在于所有的通信过程完全由系统管理而不给予干预;因此通常在模块化架构中应用较少。

2.进程间的AIDL

进程间采用的AIDL机制。这一粒度主要体现在进程层面。
在组件化通信过程中通常是在线程层面进行的。
此外,AIDL通信也被归类为系统级通信的一种。
由于Android为我们提供了相应的模板,然而,这些模板通常较为复杂,难以被普通用户所理解。
其交互方式相对繁琐,并不适合在组件化通信过程中使用。

3.匿名的内存共享

隐式的内存共享机制被广泛应用于软件开发中。例如,在一个多线程应用中使用SharedPreferences时,通常会导致线程不安全的问题,并且这种方法主要适用于存储那些变化频率较低的数据项。

这种方法的一个显著特点是在多任务处理时占用资源较少,并且特别适合用于缓存频繁使用的参数值。

但是需要注意的是,在某些特殊情况下(如组件内的配置参数等信息),这种方法仍然可能不够高效。

因此,在实际应用中应当谨慎选择适合的数据存储方式。

4.Intent Bundle传递

intent bundle的传递涉及显性和隐性两种途径。

显式传递要求明确指定包名路径。

组件之间通常会相互依赖。

这违背了组件化设计中的关注点分离原则。

如果采用隐式的方式时。

不仅所有包名路径必须唯一。

需预先定义一套规范化的规则。

只要任何一个包名路径出现问题。

排查起来会稍微繁琐一些。

这种机制更适合于组件之间的内部交互场景。

而与其他组件之间的外部交互场景相对较少。

2.2 目前主流做法之一就是引入第三者,比如图中的Base Module。

3 ARouter组件通信框架

3.1 ARouter 简介

ARouter 是阿里巴巴开源 Android 平台中的一个中间件,在该 Android 平台中负责处理 App 和业务服务之间的路由功能。它旨在为那些需求明确且操作简单的场景设计,并在构建基于组件的应用开发中发挥重要作用。

复制代码
        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开发过程中,在这个项目的核心功能是页面之间的切换。常见的需求是通过浏览器或其他应用访问我们的应用程序中的页面。即使是看似简单的页面切换操作,在技术发展的推动下也会遇到一些挑战:例如权限管理或性能优化的问题。

在URL集中管理方面存在诸多挑战,在特别是在多人协同开发时(尤其是在同一项目下),团队成员通常会在AndroidManifest.xml中配置多种IntentFilter来实现需求。采用隐式意图机制后发现该XML文档充斥着大量路径交叉和活动导出问题(即多个intent指向同一个activity或service导致的安全风险)。需解决路径重叠覆盖问题及过多Activity导出带来的安全风险等问题。

可配置性不足:由于仅支持XML格式的限制,在书写上较为繁琐,在配置过程中也会显得相对复杂,并且能够实现的自定义功能也较为有限

在跳转过程中缺乏干预权:采用intent机制进行跳转时,默认情况下开发方无法对跳转过程进行干预;此外,在某些基于切面的操作难以实现的情况下,默认将这些功能分配到子页面后进行判断显得不太合理;值得注意的是,在activity已经被实例化的前提下开展此类操作可能会带来一定的不便

跨模块之间无法建立显式的依赖关系:当App达到一定规模时,在进行系统设计与开发时,默认的做法是将应用进行水平划分并按照业务需求将其分解为多个独立的子模块实现完全解耦。通过打包流程来实现功能隔离以避免干扰,并使团队协作更加高效顺畅。此时系统只能依靠隐式的Intent跳转来进行状态切换操作。这种方式虽然操作较为繁琐但具体效果也难以预判或掌控。

为了应对上述问题, 我们需要一款具备解耦化设计、简洁且功能丰富的产品, 并且具备高度可定制性和路径拦截功能: 我们采用的是阿里云的ARouter产品. 为了节省时间并快速获取详细信息, 我们直接引用了该产品的中文介绍文档.

3.2 ARouter 优势

从 ARouter Github 了解到它的优势:

可实现对标准URL的直接跳转,并能将参数自动注入目标页面中;支持多模块工程的整合与协作;允许添加多个拦截器并自行设定拦截优先级;具备依赖注入功能,并可独立配置为专门的依赖注入框架;支持InstantRun功能;兼容Google的MultiDex方案(G方案);按组分类管理多种映射关系,并根据需求进行初始化配置;允许用户自定义全局降级策略与局部降级策略;默认情况下会自动注册页面、拦截器及服务组件至框架内;提供多种配置方式以实现动画效果切换;能够获取Fragment对象并完成其操作;完全兼容Kotlin语言以及混编开发模式;典型的应用案例:

将外部URL映射至内部页面,并进行参数传输及解析;实现跨模块之间的页面跳转,并完成不同模块间的解耦;拦截并管理所有可能的跳转流程,并负责登录及埋点等相关逻辑的处理。

跨模块API调用,通过控制反转来做组件解耦

三、典型应用场景

  1. 将外部URL对应到内部页面的同时涉及参数的传递和解析过程。
  2. 实现跨模块之间的页面转移并确保各模块间的独立化操作。
  3. 搭建拦截跳转流程的同时管理登录操作、埋点等功能相关的逻辑流程。
  4. 通过注册ARouter服务的方式实现跨模块之间的API交互,并以接口为基础进行交互连接。

文末

无论怎样面对各类规模的面试,如果不想被 interviewee 亏待就需要做到以下几点:第一,在日常学习中打好基础同样至关重要;第二,在复习阶段必须刷透所有可能考察的知识点,并进行全面复习;第三,在遇到棘手问题时要冷静分析、理性应对;第四,在提升专业能力的同时也要注重软技能培养;第五,在遇到突发情况时能够保持冷静并迅速找到解决办法;第六,在总结经验教训的过程中要不断改进和完善自己的不足之处。无论 interviewee 如何对待知识点,在深入理解的基础上应对起来也会得心应手。

小编将自己近六年的面试经验和学习笔记都归纳成一套完整的文档,并在此基础上结合自身对进阶知识的学习总结了一些高质量的学习资源。这些内容包括但不限于多套 BATJ 系列面试真题解析以及 Android 架构相关的深度学习资料。所有内容均上传在我的 GitHub 仓库中:[Android架构视频+BATJ面试专题PDF+学习笔记](https://github.com/a120464/Android-P7/blob/master/Android开发不会费�� %E7%A7 %E5%A6 %EF)%BC %EF)%BC %EF)%BC %EF)%BC %EF)%BC.md)欢迎下载参考!

A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**请君自取,无偿分享!

[外链图片转存中…(img-MgaKO9FF-1617963391153)]

其实看到身边的朋友对收入状况不满,并不只限于笔者自己同样感到困惑。实际上,在求职过程中无法有效展示个人能力是一个普遍存在的问题。因此, 笔者会持续关注并记录相关问题, 并期待与大家共同进步.

全部评论 (0)

还没有任何评论哟~