Android应用架构前世今生

Android 官方现代 App 架构解读 - 启程 2021 年底,Android 官方发博文[1]称对之前的架构指南做了一次重大改版,整体上将 App 分为 3 大部分:UI Layer、Domain Layer、Data Layer。本文就是解读此次改版的方方面面的第一篇文章,期望是通过这一系列文章带你快速掌 Android 握新版架构的核心要领。... 阅读详情

作者:黄俊彬(http://huangjunbin.com/)
责编:钱曙光(qianshg@youkuaiyun.com)
作者授权优快云发布,如需转载请联系作者本人。

前言

Android的开发生态系统发展迅速,在开发Android的几年的时间里,用来构建Android应用的架构与技术一直在不断进化。随着项目的不断更新迭代,应用的架构也有不一样的变化。由于开发人员的数量、项目的业务复杂度、需求的开发时间、应用的使用量级,使用的技术架构也不相同。没有最好的架构,只有最合适的。通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合。这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,便于项目的后期维护。下面总结及汇总一下目前Android使用的主要应用架构及其优缺点和使用的学习心得,如有不对之处,欢迎交流纠正。

mvc

还记得以前学生时代学习.NET的时候,第一次接触到项目架构叫三层架构。应用层、业务逻辑层及数据访问层。mvc的思想其实也一样,都是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。Android的项目设计本身也是采用了mvc的设计思想。

这里写图片描述

  • 视图层(View)
    一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。
  • 控制层(Controller)
    Android的控制层主要就是Activity层。相关View层交互触发及数据展示逻辑都在Activity中进行编码。
  • 模型层(Model)

我们通常针对业务数据,都会定义好对应的Model层。数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的

所以一直以来我们使用Android默认的项目结构开发,主要都是在采用mvc的架构思想。

优点: 适用了简单的页面展示,业务逻辑不复杂。开发效果高,代码层级也简单易懂

缺点: 当业务复杂时,Activity非常臃肿,不便于维护及测试

mvp

mvp这是目前我们项目中主要采用的应用架构方式,MVP从更早的MVC框架演变过来,与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。mvp架构的演变,解决了Activity代码臃肿的问题,当我们将Activity复杂的逻辑处理移至另外的一个类(Presenter)中时,Activity其实就是MVP模式中的View,它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由 Presenter处理)。项目开发中,UI是容易变化的,且是多样的,一样的数据会有N种显示方式;业务逻辑也是比较容易变化的。为了使得应用具有较大的弹性,我们期望将UI、逻辑(UI的逻辑和业务逻辑)和数据隔离开来,而MVP是一个很好的选择。在MVP模式里通常包含3个要素(加上View interface是4个):

这里写图片描述

  • View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity)
  • Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)
  • Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
  • View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试

优点:

  1. Model与View完全分离,修改互不影响
  2. 更高效地使用,因为所有的逻辑交互都发生在一个地方—Presenter内部
  3. 一个Preseter可用于多个View,而不需要改变Presenter的逻辑(因为View的变化总是比Model的变化频繁)。
  4. 更便于测试。把逻辑放在Presenter中,就可以脱离用户接口来测试逻辑(单元测试)

缺点:需要拿捏好Presenter、View interface的颗粒度设计,容易出现Presenter过于简单或则复杂化。

mvvm

MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力

这里写图片描述

  • View(视图层)采用XML文件进行界面的描述;
  • Model(模型层)通过网络和本地数据库获取视图层所需数据;
  • ViewModel(视图-模型层)负责View和Model之间的通信,以此分离视图和数据。

View和Model之间通过Android Data Binding技术,实现视图和数据的双向绑定;ViewModel持有Model的引用,通过Model的方法请求数据;获取数据后,通过Callback(回调)的方式回到ViewModel中,由于ViewModel与View的双向绑定,使得界面得以实时更新。同时,界面输入的数据变化时,由于双向绑定技术,ViewModel中的数据得以实时更新,提高了数据采集的效率。

采用ViewModel解决MVP中View(Activity)和Presenter相互持有对方应用的问题,界面由数据进行驱动,响应界面操作无需由View(Activity)传递,数据的变化也无需Presenter调用View(Activity)实现,使得数据传递的过程更加简洁,高效。

推荐教程:

精通 Android Data Binding

优点:

  • 双向绑定技术,当Model变化时,View-Model会自动更新,View也会自动变化。很好做到数据的一致性
  • Google官方支持databing,易于集成

缺点:

  • 数据绑定使得 Bug 很难被调试
  • 数据双向绑定不利于代码重用及扩展
  • 代码的阅读性降低

android-architecture

google在官方示例中给出了一系列不同架构的app实现,项目目的是通过展示各种架构app的不同方式来帮助开发者解决架构问题。项目中通过不同的架构概念及方式实现了功能相同的app。

Google官方MVP架构示例项目

TODO-MVP-RXJAVA

这里写图片描述

使用RXJAVA对数据流进行处理,并且通过Repository进行数据的集中管理,通过协议类XXXContract来对View和Presenter的接口进行内部继承,在presenter的实现类中,可以对Model数据进行操作。实例中,数据的获取、存储、数据状态变化都是model层的任务,presenter会根据需要调用该层的数据处理逻辑并在需要时将回调传入。这样model、presenter、view都只处理各自的任务,实现单一责任原则。

推荐教程:

Google官方MVP+Rxjava项目详解

组件化

随着项目的推进,及企业业务的发展。有一天可以发现团队内部需要开发多个APP,且多个APP中存在相同的业务模块,一开始的做法为了赶项目进度可能就是黏贴复制,到后面就慢慢发现越来越吃力,重复劳动。

慢慢随着时间的推移,恶性循环。慢慢发现项目代码结构混乱、层次不清,各业务技术方案不统一;甚至连基本的包结构也是胡乱不堪,都是不停地往上堆砌代码添加新功能,前人挖坑后人填。可见组件化对于不断迭代的项目有着深远的意义

  1. 避免重复造轮子,提高开发效率
  2. 减低耦合度,提高复用性
  3. 保持团队的技术方案统一性
  4. 便于维护升级

基础组件化

通常项目中常用的结构如下:

这里写图片描述

看似没什么问题,但通常我们的一些库都是以代码的形式集成在代码中,随着项目推进,慢慢发现一些比较严重的问题。

  1. 业务代码侵入组件代码中 (例如一些全局的网络返回响应,直接在库中编码等)
  2. 团队内部没约束,各自集成不同的基础库(例如图片加载有的用Glide,有的用ImageLoader)
  3. 部分第三方组件停止更新,项目代码耦合高,替换新方案难

所以在实际设施组件化的过程中,建议参考:

  1. 独立library库(Common基础组件),避免在主工程中直接以代码集成,使用aar方式引用
  2. 第三方的库调用最好再装一层接口,以便后续维护升级
  3. 有成员专门负责维护,可以以SDK的方式提供业务层的调用

业务模块化

随着项目逻辑不断的增加,慢慢是不是发现代码编译速度是不是越来越慢?(PS:我们目前项目编译一次2分钟,且已是经过一些优化处理)

另外当团队内部有多个项目时,是不是经历过产品经理让你把项目A的某个功能移到项目B去,这个时候… …

这里写图片描述

业务模块化的作用性就很明显了

  1. 业务模块间避免耦合,提高复用性
  2. 业务模块独立编译运行

推荐教程:

思考

  • 项目架构都是不断演进,不是一蹴而就
  • 没有最好的架构,只有在适当的时机,最合适的架构
  • 项目重构过程是艰难的,但长痛不如短痛
Android Jetpack 全家桶系列(一)起始篇:Jetpack 的前世今生 谷歌仍旧不断的完善AndroidJetpack,截至到2019年8月已经有很多新加的组件并没有显示在上图中,比如CameraX等。等,随着框架越来越多,一个应用可以有多种技术选型,直接导致应用开发越来越不规范,导致做出来的应用质量参差不齐,这显然不是谷歌想看到的;ViewModel以生命周期的方式管理界面相关的数据,通常和DataBinding配合使用,为开发者实现MVVM架构提供了强有力的支持。一开始时框架很少,也没有什么规范,所有的代码都是要自己写,比如网络请求,数据库请求,数据解析等等。...... 阅读详情

相关推荐

STM32F407控制舵机

STM32F407控制舵机运行 使用STM32F407控制舵机,首先来看下舵机图片 [黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)] 舵机需要信号的周期为20ms,即频率为50Hz。 接下来正式操作: 步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到) #include "pwm.h" void TIM14_CH1_PWM_In

Ievn_Hare的博客 1万+

【Android】Android的应用架构

我们常见的 Android App 一般是由四大组件组成的,其中最常见的是 Activity 和 Service 等。一个 App 可能包含多个组件,而且移动设备资源有限,系统可能会随时终止某些 App ,鉴于这种情况,App 被销毁是不受开发者控制的,那么 App 的数据和状态就不应该在内存中进行存储,而且, 不同的组件之间不应该有依赖关系。基于上述的一些客观情况,Android 为我们提供了一套开发的基本规则和从系统 API 层面的规避风险的支持。但作为开发者,也要注意避免这些情况的出现。随着 Andr

m0_56144365的博客 2216

LangChain + Milvus Lite:从零搭建本地RAG知识库

本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。

weixin_29044713的博客 444

Android架构组件-App架构指南

与传统的桌面应用程序不同,Android应用程序的结构要复杂得多,在大多数情况下,它们只在桌面快捷启动方式中有一个入口,并且作为单个进程运行。一个典型的Android应用程序是由多个 app组件(Android四大组件) 构成的,包括 **activities**, **fragments**, **services**, **content providers** and **broadcast receivers

不学习傻了吧 1万+

冗余位技术在SAR ADC中的动态误差恢复机制解析

本文深入解析了冗余位技术在SAR ADC中的动态误差恢复机制,详细介绍了其基本概念、动态误差产生原因及冗余位的容错空间设计、时序松弛策略和数字校正算法。通过实际电路设计案例和数学建模,展示了冗余位技术如何显著提升ADC的精度和能效比,同时探讨了未来发展方向。

weixin_28335283的博客 975

Python 爬虫实战:爬虫与 ECharts 结合 —— 前端可视化展示

本文介绍了爬虫技术与ECharts可视化结合的完整实现流程。首先使用Python爬取京东商品数据(价格、评价数等),通过BeautifulSoup解析和pandas处理转换为JSON格式。然后构建前端页面,利用ECharts实现价格分布柱状图、价格-评价数散点图和店铺占比饼图三种可视化效果。文章详细解析了爬虫数据提取、格式转换和前端图表配置等关键技术点,并提供了完整的代码示例。最后提出了基于API接口、数据库存储等扩展方向,为数据采集到可视化展示提供了完整的解决方案。

2503_91057718的博客 631

android软件架构

系统应用:Android系统还包括了一些系统应用,这些应用程序是Android系统的一部分,用于提供系统级的功能和服务,如电话、短信、联系人、日历、设置等。提供统一的接口:硬件抽象层为每个硬件设备定义了一组标准的API接口,这使得上层的应用程序和系统组件可以使用统一的方式来访问和控制各种硬件设备。总之,硬件抽象层在Android系统中起到了桥梁的作用,它提供了一种统一的方式来访问和控制各种硬件设备,使得Android系统能够在不同的硬件平台上运行,并且为上层的应用程序和系统组件提供了简单和统一的硬件接口。

zhanlan5211的博客 3547

华为OD机试 - TLV格式(Python/JS/C/C++ 2025 C卷 100分)

两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成。第二行:需要匹配的tag数量n(0 < n < 1000)后面N行:需要匹配n个tag值(十进制表示),递增排列。标签10(0A)存在,长度3,valueOffset=2。标签15(0F)长度4,valueOffset=2。标签14(0E)长度2,valueOffset=8。

学Java,找哪吒 2040

Android 官方现代 App 架构指南

今年的 Google I/O 发布了一个最新的官方示例 Now in Android,这个示例的完整度比之前的 JetNews、Sunflower 要高,后面也将基于这个仓库做进一步的说明解析,从一个完整项目的角度来看 Android 新推出的架构指南。

m0_72538886的博客 2780

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 242

STM32Cube高效开发教程<高级篇><FreeRTOS>(十八)-----软件定时器

一、 软件定时器概述声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(高级篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。在FreeRTOS中,自动创建的任务有空闲任务和定时器服务任务。FreeRTOS可以通过定时器服务任务提供软件定时器功能。在某些对定时精度要求不太高,无须使用硬件定时器的情况下,我们可以使用FreeRTOS的软件定时器。

我的博客 157

Android 开发之初识 Android

最近在学习 Android 方面的知识,刚好趁着这个机会整理一下 Android 开发方面的一些知识点。从标题中可以看到,今天只是给大家简单介绍一下 Android 的内容,并没有涉及到代码方面的内容,代码层面的内容会在下一篇文章中进行展示。首先先看一下本文的大纲 内容大纲1. Android 前世今生1.1 Android 介绍1.2 Android 发展历程2. Android 架构2.1 Linux内核层2.2 Libraries 系统运行库2.3 应用框架层2.4 应用层3. Android 四大组

小曾同学的博客 4182

把慢点掰开看:在 SAP HANA 中启用 SQL 优化耗时跟踪 SqlOptTime 的实战指南

摘要:SAP HANA 性能排查中,常出现SQL查询时快时慢的现象,表面看似执行问题,实则是编译阶段耗时过长。通过SQL优化跟踪工具SqlOptStep和SqlOptTime,可精准区分编译与执行时间。SqlOptStep展示优化树变化过程,而SqlOptTime则记录各阶段耗时,帮助定位问题根源。启用SqlOptTime需配置traceprofile,建议限定特定用户以减少系统负载。实际案例显示,报表响应慢常由计算视图编译(CeQo)导致,而非执行阶段问题。解决方案包括调整计算视图展开方式或优化基础视图结

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1009

Jetpack 全家桶系列(一)起始篇:Jetpack 的前世今生

谷歌仍旧不断的完善Android Jetpack,截至到2019年8月已经有很多新加的组件并没有显示在上图中,比如CameraX等。等,随着框架越来越多,一个应用可以有多种技术选型,直接导致应用开发越来越不规范,导致做出来的应用质量参差不齐,这显然不是谷歌想看到的;ViewModel:以生命周期的方式管理界面相关的数据,通常和DataBinding配合使用,为开发者实现MVVM架构提供了强有力的支持。一开始时框架很少,也没有什么规范,所有的代码都是要自己写,比如网络请求,数据库请求,数据解析等等。

chuyouyinghe的专栏 335

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android第三方今日头条、仿知乎日报、录音文字动画、多种跑马灯效果等源码

Android精选源码 MVP+Retrofit+RxJava 实例源码 android图片加滤镜特效源码 自定义支付密码弹窗,可拓展性高,界面友好,注释详细 android 自定义录音、播放动画View效果 实现一个完整的复杂列表布局源码 Android实现仿QQ、微信头像剪切效果...

chuangzhi9350的博客 326

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android Jetpack从入门到精通,干货满满

自2018年面世,Jetpac也迎来自己的第五个年头,在当初的基础上又多了许多的新组件。但是,也有很多Android工程师五年过去了都停留在:知道、了解过、但没用过。Jetpack 是Android组件的集合,可帮助开发者遵循最佳实践、让开发者摆脱编写样板代码并简化复杂任务,以便于开发者可将精力集中于真正重要的编码工作。1.1 简介1.2 特性1.3 分类1.4 应用架构Startup利弊。

2501_90399438的博客 1125

Android Support Library架构解析与最佳实践

Android兼容性支持库是解决碎片化问题的核心技术方案,其核心原理是通过API反向移植实现新旧平台的功能对齐。作为Android开发基础架构的重要组成部分,Support Library通过模块化设计提供了从UI组件(ContextCompat/ActivityCompat)到架构设计(Fragment/ViewModel)的全套解决方案。在工程实践中,开发者常需处理版本管理、资源冲突等典型问题,而Material Design兼容实现等特性则大幅降低了跨平台UI开发成本。随着AndroidX的演进,理解

weixin_30700977的博客 451

Android 系统架构

通用base 从BaseActivity与BaseFragment的封装谈起 我的最简MVP Common Apache Commons工具集简介 Java技术栈,有的Android可能用不到 android-architecture-components Google的Samples for Android Architecture Components. BaseProject MVP+

ThePromonkeyOf_HeLuo的博客 606

android第三方今日头条、仿知乎日报、录音文字动画、多种跑马灯效果等源码...

Android精选源码 MVP+Retrofit+RxJava 实例源码 android图片加滤镜特效源码 自定义支付密码弹窗,可拓展性高,界面友好,注释详细 android 自定义录音、播放动画View效果 实现一个完整的复杂列表布局源码 Android实现仿QQ、微信头像剪切效果源码 一个把文字转化为路径动画然后展现出来的...

weixin_33908217的博客 424

进阶高工必备技能:Android插件化技术全解析!(附项目实战+视频分享)

插件化的前世今生 插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概念的提出(Android版本),到2016年插件化的百花争艳,可以说,插件化技术引领着Android技术的进步。 插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件。支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些不常用的功能模块做成插件,一方面减小了安装包的大小,另一方面可以实现app功能的动态扩展。想要实现插件化,主要是解决下面三个问题: 插件中代码的加载

star_nwe的博客 607

不会吧!做Android开发还不会Jetpack架构组件?快来看看这篇文章吧!

前言 最近两年,MVVM的呼声越来越高,说实话,在经历了MVP的臃肿,MVP的繁琐,我有点怕了。但是这次Google官方带来的一系列为MVVM架构设计的武器—Jetpack,真的让我惊喜到了。 也许你还没有使用这个新的武器,那么我真的建议你去使用一下,感受下这个新武器的快准狠,感受下这个新架构的精妙解耦。 Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。 今日分享:Jetpack

Android 开发架构 420
上一篇: 容器化RDS|计算存储分离架构下的IO优化
下一篇: 编写高性能Java代码的最佳实践
csdn研发技术
博客等级 码龄9年 1381粉丝 90原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值