Android项目架构怎么做

项目架构指南

本指南包含一些最佳做法和推荐架构,有助于构建强大而优质的应用。

注意: 本页假定您对 Android 框架有基本的了解。

移动应用用户体验

典型的 Android 应用包含多个应用组件,包括 Activity、Fragment、Service、内容提供程序和广播接收器。应用需要适应不同类型的用户驱动型工作流和任务,因为用户经常在短时间内与多个应用进行互动。

请注意,移动设备的资源也很有限,因此操作系统可能随时终止某些应用进程以便为新的进程腾出空间。

鉴于这种环境条件,您的应用组件可以不按顺序地单独启动,并且操作系统或用户可以随时销毁它们。由于这些事件不受您的控制,因此您不应在内存中存储或保留任何应用数据或状态,并且应用组件不应相互依赖。

常见的架构原则

如果您不应使用应用组件存储应用数据和状态,那么您应该改为如何设计应用呢?

随着 Android 应用大小不断增加,您定义的架构务必要能允许应用扩缩、提升应用的稳健性并且方便对应用进行测试。

应用架构定义了应用的各个部分之间的界限以及每个部分应承担的职责。为了满足上述需求,您应该按照某些特定原则设计应用架构。

分离关注点

分离关注点是遵循的最重要的原则。不要在一个 Activity 或 Fragment 中编写所有代码,保持界面相关类精简,减少与组件生命周期相关的问题,提高可测试性。

请注意,您并非拥有 Activity 和 Fragment 的实现;它们只是表示 Android 操作系统与应用之间关系的粘合类。操作系统可能会根据用户互动或因内存不足等系统条件随时销毁它们。为了提供令人满意的用户体验和更易于管理的应用维护体验,最好尽量减少对它们的依赖。

通过数据模型驱动界面

通过数据模型驱动界面,使用持久性模型,独立于界面元素和其他组件,提高测试性和稳定性。

持久性模型是理想之选,原因如下:

  • 如果 Android 操作系统销毁应用以释放资源,用户不会丢失数据。
  • 当网络连接不稳定或不可用时,应用会继续工作。

如果您的应用架构以数据模型类为基础,您的应用会更便于测试、更稳定可靠。

单一数据源

为应用中的每种不同类型的数据分配单一数据源 (SSOT),集中更改、保护数据,更易于跟踪数据变化。

此模式具有多种优势:

  • 将对特定类型数据的所有更改集中到一处。
  • 保护数据,防止其他类型篡改此数据。
  • 更易于跟踪对数据的更改。因此,也就更容易发现 bug。

在离线优先应用中,应用数据的单一数据源通常是数据库。在其他某些情况下,单一数据源可以是 ViewModel 甚至是界面。

单向数据流

采用单向数据流 (UDF) 模式,确保状态或数据从高层次结构流向低层次结构,事件从低层次结构触发,保证数据一致性。

在 Android 中,状态或数据通常从分区层次结构中较高的分区类型流向较低的分区类型。事件通常在分区层次结构中较低的分区类型触发,直到其到达 SSOT 的相应数据类型。例如,应用数据通常从数据源流向界面。用户事件(例如按钮按下操作)从界面流向 SSOT,在 SSOT 中应用数据被修改并以不可变类型公开。

此模式可以更好地保证数据一致性,不易出错、更易于调试,并且具备 SSOT 模式的所有优势。

推荐的应用架构

基于上一部分提到的常见架构原则,每个应用应至少有两个层:

界面层 - 在屏幕上显示应用数据。
数据层 - 包含应用的业务逻辑并公开应用数据。
您可以额外添加一个名为“网域层”的架构层,以简化和重复使用界面层与数据层之间的交互。
在这里插入图片描述

现代应用架构

此现代应用架构鼓励采用以下方法及其他一些方法:

  • 反应式分层架构。
  • 应用的所有层中的单向数据流 (UDF)。
  • 包含状态容器的界面层,用于管理界面的复杂性。
  • 协程和数据流。
  • 依赖项注入最佳实践。

界面层

界面层包括界面元素和状态容器,用于显示应用数据,通过依赖于状态容器获取数据。
界面层由以下两部分组成:

  • 在屏幕上呈现数据的界面元素。您可以使用 View 或 Jetpack Compose 函数构建这些元素。
  • 用于存储数据、向界面提供数据以及处理逻辑的状态容器(如 ViewModel 类)。
    在这里插入图片描述

数据层

应用的数据层包含业务逻辑。业务逻辑决定应用的价值,它包含决定应用如何创建、存储和更改数据的规则。

数据层由多个仓库组成,其中每个仓库都可以包含零到多个数据源。您应该为应用中处理的每种不同类型的数据分别创建一个存储库类。例如,您可以为与电影相关的数据创建一个 MoviesRepository 类,或者为与付款相关的数据创建一个 PaymentsRepository 类。
在这里插入图片描述
存储库类负责以下任务:

  • 向应用的其余部分公开数据。
  • 集中处理数据变化。
  • 解决多个数据源之间的冲突。
  • 对应用其余部分的数据源进行抽象化处理。
  • 包含业务逻辑。

每个数据源类应仅负责处理一个数据源,数据源可以是文件、网络来源或本地数据库。数据源类是应用与数据操作系统之间的桥梁。

网域层

网域层是可选的,用于封装复杂业务逻辑,提供依赖给界面层,依赖于数据层。

网域层负责封装复杂的业务逻辑,或者由多个 ViewModel 重复使用的简单业务逻辑。此层是可选的,因为并非所有应用都有这类需求。请仅在需要时使用该层,例如处理复杂逻辑或支持可重用性。
在这里插入图片描述
此层中的类通常称为“用例”或“交互方”。每个用例都应仅负责单个功能。例如,如果多个 ViewModel 依赖时区在屏幕上显示适当的消息,则您的应用可能具有 GetTimeZoneUseCase 类。

管理组件之间的依赖关系

应用中的类要依赖其他类才能正常工作。您可以使用以下任一设计模式来收集特定类的依赖项:

  • 依赖注入 (DI):依赖注入使类能够定义其依赖项而不构造它们。在运行时,另一个类负责提供这些依赖项。
  • 服务定位器:服务定位器模式提供了一个注册表,类可以从中获取其依赖项而不构造它们。
    您可以借助这些模式来扩展代码,因为它们可提供清晰的依赖项管理模式(无需复制代码,也不会增添复杂性)。 此外,您还可以借助这些模式在测试和生产实现之间快速切换。

我们建议在 Android 应用中采用依赖项注入模式并使用 Hilt 库。Hilt 通过遍历依赖项树自动构造对象,为依赖项提供编译时保证,并为 Android 框架类创建依赖项容器

常见的最佳实践

编程是一个创造性的领域,构建 Android 应用也不例外。 无论是在多个 activity 或 fragment 之间传递数据,检索远程数据并将其保留在本地以在离线模式下使用,还是复杂应用遇到的任何其他常见情况,解决问题的方法都会有很多种。

虽然以下建议不是强制性的,但在大多数情况下,遵循这些建议会使您的代码库更强大、可测试性更高且更易维护:

  • 不要将数据存储在应用组件中。请避免将应用的入口点(如 activity、Service 和广播接收器)指定为数据源。相反,您应只将其与其他组件协调,以检索与该入口点相关的数据子集。每个应用组件存在的时间都很短暂,具体取决于用户与其设备的交互情况以及系统当前的整体运行状况。

  • 减少对 Android 类的依赖。您的应用组件应该是唯一依赖于 Android 框架 SDK API(例如 Context 或 Toast)的类。将应用中的其他类与这些类分离开来有助于改善可测试性,并减少应用中的耦合。

  • 在应用的各个模块之间设定明确定义的职责界限。例如,请勿在代码库中将从网络加载数据的代码散布到多个类或软件包中。同样,也不要将不相关的职责(如数据缓存和数据绑定)定义到同一个类中。遵循推荐的应用架构可以帮助您解决此问题。

  • 尽量少公开每个模块中的代码。例如,请勿试图创建从模块提供内部实现细节的快捷方式。短期内,您可能会省点时间,但随着代码库的不断发展,您可能会反复陷入技术上的麻烦。

  • 专注于应用的独特核心,使其脱颖而出。不要一次又一次地编写相同的样板代码,这是在做无用功。 相反,您应将时间和精力集中放在能让应用与众不同的方面上,并让 Jetpack 库以及建议的其他库处理重复的样板。

  • 考虑如何使应用的每个部分可独立测试。例如,如果使用明确定义的 API 从网络获取数据,将会更容易测试在本地数据库中保留该数据的模块。如果您将这两个模块的逻辑混放在一处,或将网络代码分散在整个代码库中,那么即便能够进行有效测试,难度也会大很多。

  • 类型负责其并发政策。如果某种类型正在执行长时间运行的阻塞工作,则应负责将该计算移至正确的线程。该特定类型知道它正在执行的计算类型及其应在哪个线程中执行。类型应该具有主线程安全性,这意味着,您可以安全地从主线程调用这些类型而不会阻塞。

  • 保留尽可能多的相关数据和最新数据。这样,即使用户的设备处于离线模式,他们也可以使用您应用的功能。请记住,并非所有用户都能享受到稳定的高速连接 - 即使有时可以使用,在比较拥挤的地方网络信号也可能不佳。

架构的优势

良好的架构为项目和工程团队带来多方面的好处:

  • 提高整个应用的可维护性、质量和稳健性。
  • 允许应用扩缩,减少代码冲突,增加贡献者。
  • 新手上手更容易,团队效率提高。
  • 更易于测试,调查 bug 更有条理。
  • 用户体验更稳定,工程团队效率提高。

架构需要前期时间投入,但会对项目产生积极影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/325623.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计----SSH滑雪场场地租赁管理系统

项目介绍 该项目主要包括三个角色:管理员、收银员、用户; 用户角色包含以下功能: 用户登录,修改个人信息,查看我的订单等功能。 管理员角色包含以下功能: 管理员登录,滑雪场管理,订单管理,教练管理,器材管理,会员管理,收银员管…

docker容器和常用命令

1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …

黑龙江教育杂志黑龙江教育杂志社黑龙江教育编辑部2023年第11期目录

卷首/开篇 科学的“加法”是什么 陆鹤鸣; 1 聚焦/管理_家校合作 “双减”背景下高中家校共育的现状与成因探析——哈尔滨市第九中学调查问卷分析 李佰嵩;张雨萌;李丹丹;岳彤; 4-6 共筑家校成长共同体 开创家校共育新生态 李隽;李俊峰;胡胜男; 7-9《黑龙江教育》投稿…

关于C#中的async/await的理解

1. 使用async标记的方法被认为是一个异步方法,如果不使用await关键字,调用跟普通方法没有区别 static async Task Main(string[] args){Console.WriteLine("主线程id:" Thread.CurrentThread.ManagedThreadId);TestAwait();Consol…

表的增删改查CURD(一)

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 新增(Create) 全列插入 指定列…

docker使用nginx部署vue刷新页面404

docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的,但是刷新页面之后就显示404,关键是我两个前端项目都是用的这一个配置文件,但是只有一个项目出现刷新浏览器显示404的问题,这给我搞懵了!&…

一些面试会问到的奇怪问题与面试总结

1.v-for、v-if先后顺序。 官方不建议一起使用,但是有时候面试的时候会问到。 在vue2中是v-for先与v-if的。 源码js编译结果: _c()就是vm.$createElement(),意思是创建一个虚拟的element,就是返回值是VNode。 _l就是renderlist…

关于java创建对象内存分析

关于java创建对象内存分析 我们在前面的文章中,了解了类和对象,以及创建对象,给对象赋值等,我们本篇文章来进一步了解一下创建对象的时候,堆和栈的情况,以及对内存的分析😀 1、创建一个类 我…

虚拟机连接(与主机断开连接)U盘的按钮为灰色之解决方法

在WIN11中,虚拟机“连接(与主机断开连接)U盘”选项为灰色,解决方法如下: 1、关闭虚拟机电源,得到下面的界面: 2、根据上述提示,找到虚拟机所在磁盘 3、配置文件属性见下图: 4、使用记事本打开…

【深度学习:Synthetic Training Data 】合成训练数据简介

【深度学习:Synthetic Training Data 】合成训练数据简介 计算机视觉模型的视频标签视频注释与图像注释‍Data 数据‍Annotation process ‍标注流程‍Accuracy 准确性 ‍注释视频的优点易于数据收集时间背景实用功能 视频注释用例自动驾驶汽车姿态估计交通监控医学…

Python源码26:海龟画图turtle画向日葵

---------------turtle源码集合--------------- Python教程43:海龟画图turtle画小樱魔法阵 Python教程42:海龟画图turtle画海绵宝宝 Python教程41:海龟画图turtle画蜡笔小新 Python教程40:使用turtle画一只杰瑞 Python教程39…

KT148A语音芯片智能锁扩展语音地址以及如何支持大量小文件的打包

一、语音芯片应用于智能锁的需求 智能锁的语音播放需求中,有很多需要多国语言合并在一起的需求 其中语音文件数多,并且每个语音文件小的特点 如果使用OTP的语音芯片,就很麻烦,因为用户不可烧录,调试也很繁琐 同时大…

Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频

Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏,现已发布新版 3.0 及其介绍视频。视频请见: https://www.bilibili.com/video/BV1RK4y1z7Qz/ 老版本 JMine 1.2.5 的介绍视频请见…

跨越数字化鸿沟:企业转型的领导力与执行力,数字化转型浪潮下创新、变革与持续发展

在数字化转型的浪潮下,企业面临着巨大的机遇与挑战。如何成功跨越数字化鸿沟,实现转型发展,是企业领导者必须深思的问题。领导力、执行力与创新、变革、持续发展之间的关系成为关键。本文将深入探讨这些因素如何共同作用,帮助企业…

GZ075 云计算应用赛题第10套

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷10 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenS…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…

上门按摩APP系统公众号H5搭建能为客户带来哪些便捷。

大家好!今天我来给大家介绍一下上门按摩系统H5搭建。你有没有曾经因为工作疲劳、肌肉酸痛而感到身体不适?或者是因为长时间坐在电脑前,感觉脖子和肩膀快要僵硬了?如果你有这样的困扰,那么上门按摩系统公众号绝对是你的…

黑马程序员——javase基础——day01——Java入门IDEA基础语法

目录: Java入门 Java简介JDK的下载和安装第一个程序常见问题常用DOS命令Path环境变量IDEA IDEA概述和安装IDEA中HelloWorldIDEA中基本配置&注释IDEA中常用快捷键IDEA中模块操作基础语法 字面量数据类型变量变量的案例 手机信息描述疫情防控信息采集表变量的注意…

linux云服务器 如何将数据盘挂载到系统盘上面?

先认识认识下面几个常用命令 lsblk 命令:查看设备列表,也就是能看到系统盘和数据盘一般为:vda(系统盘)、vdb(数据盘)等等 lsblk"ls" 是 "list" 的缩写: lsblk…

29K star!关于shell,你需要的都在这里

Awesome 是GitHub上一个神奇的单词,搜索Awesome可以发现非常多精彩的汇总性项目,涉及到各种方面,而且star都非常多。 今天我们推荐的开源项目帮你整理了玩转shell所需的一切,本项目目前在GitHub已超过29K Star,它就是…
最新文章