NowinAndroid—2024 Android现代开发全功能应用

NowinAndroid—2024 Android现代开发全功能应用

现代Android开发全功能示例应用Now-in-Android,它是用Kotlin和Jetpack Compose开发的,功能非常强大。这个应用遵循了安卓设计和开发的最佳方法,旨在给开发者提供实用的参考资料。无论你是新手还是专家,都能从中学到很多有用的知识和技巧。

作为一款开发中的应用,它的目标是通过定期提供新闻更新,帮助开发者们与安卓开发的世界保持同步。该应用目前正在开发中prodRelease版本已经在Play商店上可用。

“Now in Android” 应用展示了 “Now in Android” 系列的内容,用户可以浏览最新的视频、文章和其他内容的链接。此外,用户还可以关注自己感兴趣的主题,当有新内容发布与其关注的主题相匹配时,会收到通知提醒。


Now in Android应用遵循官方架构指南及模块化开发。

UI

该应用采用了 Material 3 设计准则进行设计。

所有的屏幕和用户界面元素都是使用 Jetpack Compose 构建的。

该应用有两个主题:

动态颜色主题 - 根据用户当前的颜色主题使用相应的颜色(如果支持)
默认主题 - 当不支持动态颜色时,使用预定义的颜色
每个主题都支持暗黑模式。

应用采用自适应布局,以支持不同尺寸的屏幕。

app架构

在app架构学习过程中,您将深入了解 Now in Android 应用的架构:包括其各个层级、关键类以及它们之间的相互作用。
app架构包含三层: data layer, domain layer 和 UI layer。


该架构采用了响应式编程模型,具有单向数据流。在最底层是数据层,其核心概念包括:

  • 上层对下层的变化进行响应。
  • 事件从上层向下流动。
  • 数据从下层向上流动。
  • 使用流实现数据流,采用 Kotlin Flows 实现。

示例:显示新闻列表

当应用程序首次运行时,它会尝试从远程服务器加载新闻资源列表(在选择“正式版”构建时,演示版本将使用本地数据)。加载完成后,根据用户选择的兴趣向其展示这些新闻。
下面的图示展示了所发生的事件以及数据如何从相关对象中流动,实现这一目标。

模块化

在这个学习过程中,您将深入了解模块化概念,以及在 Now in Android 应用程序中用于创建模块的模块化策略。
模块化是将原本庞大且单一的代码库拆分成松耦合、自包含的模块的一种实践。

模块化优点

  1. 可扩展性:模块化将关注点分离,使得项目更容易扩展和修改,提供了更大的自主权和架构模式的支持。

  2. 并行工作:模块化减少了版本控制冲突,使得开发人员在大型团队中能够更高效地并行工作。

  3. 单一职责:每个模块都有专门负责的所有者,负责维护代码、修复错误和审核更改。

  4. 封装性:隔离的代码更易于阅读、理解、测试和维护。

  5. 减少构建时间:利用 Gradle 的并行和增量构建可以减少构建时间。

  6. 动态交付:模块化是 Play Feature Delivery 的要求,可以根据条件或按需下载特定功能。

  7. 可重用性:适当的模块化使得代码共享和从相同基础构建多个应用程序成为可能,跨不同平台。

模块化缺点

  1. 过多的模块会增加构建配置的复杂性,导致 Gradle 同步时间增加,并产生持续的维护成本。

  2. 如果模块数量过少、大而紧密耦合,就会失去模块化的好处,形成另一个庞大的模块。

  3. 模块化可能会导致项目过于复杂,没有一种通用解决方案。并不是所有项目都适合进行模块化,特别是对于规模较小且不太可能进一步扩展的项目来说,可扩展性和构建时间优势可能并不适用。

综上所述,模块化是有益的,但需要根据实际情况进行权衡和决策。

模块化策略

需要遵循2条原则

低耦合 - 模块之间应该尽可能独立,这样对一个模块的更改对其他模块的影响应该为零或最小。

高内聚 - 一个模块应该包含一个作为系统运行的代码集合。它应该有明确定义的职责,并在某些领域知识的界限内保持。

NowinAndroid中的模块化类型

参考链接

https://developer.android.com/topic/architecture
https://developer.android.com/jetpack/compose
https://developer.android.com/topic/architecture
https://github.com/android/nowinandroid
https://m3.material.io/

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【控制篇 / 策略】(7.4) ❀ 04. 修改IP地理位置数据库 ❀ FortiGate 防火墙

【简介】虽然通过FortiGuard服务可以更新IP地理位置数据库,但是实际使用环境中,总会有部分IP地址不符合我们的愿景,这种情况下,可以通过修改IP地理位置数据库来达到我们的目标。 更新IP地理位置数据库 更新IP地理位置数据库是Fort…

嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客:Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程(群友Blev提供) - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net) 一. 环境准备 1.下载qt5源码:Open Source Development | Open Source …

LeetCode刷题:141. 环形链表

题目: 是否独立解答出:否,有思路,但是代码报错,参考解题代码后,修改通过 解题思路:利用循环与哈希表存储每一个节点,如果发现添加不进去说明,存在环,正常来说…

Docker的基础概念及命令

这篇主要介绍一下Docker比较重要的两个概念,镜像和容器,以及操作它们的一些常用命令。 文章目录 一、基础命令二、镜像三、容器 一、基础命令 docker -v:查看 Docker 的版本 systemctl start docker:启动docker systemctl stat…

刚买的助听器就弄丢了,不想白配,快来看看这8大助听器防丢小技巧

我们知道助听器可以让听损人士重新听到美妙的声音和享受沟通的乐趣。但是,助听器也是一种很贵的物品,如果不小心弄丢了,就会让人心痛不已。 更有甚者,有些人因为害怕丢失助听器,而不敢佩戴助听器,错过了听力…

基于SSM的驾校预约管理系统

基于SSM的驾校预约管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 随着社会的不断发展,驾驶技能的需求逐渐增…

大数据人工智能在线实习项目:某实习网站招聘信息采集与分析

01前置课程 Python编程基础 Python网络爬虫实战 Python爬虫环境与爬虫简介 网页前端基础 简单静态网页爬取 常规动态网页爬取 模拟登录 Python数据分析与应用、可视化 数据分析概述 Numpy数值计算 Pandas统计分析与数据预处理 Matplotlib可视化 Pyecharts绘图 02师…

第一波!2024年1月精选6款实用AI人工智能设计工具合集

大家好,这是进入2024年之后的第一波干货合集!这次的干货合集还是以 AI 相关的设计干货开头,这次有了在本地无限制帮你清理图片中元素的 AI 工具,有知名免费图库出品的实时 AI 图片生成工具、将截图直接转化为代码的超强工具&#…

扫描电镜技术在材料科学中的应用及发展趋势

在材料科学领域,扫描电镜技术扮演着极为重要的角色,广泛应用于多种材料形态结构、界面状况、损伤机制和材料性能预测的研究。本文将深入探讨扫描电镜技术的结构、主要性能、工作原理、试样制备技术以及在不同领域的应用。 第一部分:扫描电镜…

Flowable可视化流程设计器Flowable BPMN visualizer

1.安装IDEA插件Flowable BPMN visualizer IDEA插件市场中搜索Flowable BPMN visualizer安装该插件 2.创建流程图 2.1.创建流程图文件 在resources下创建myProcess.bpmn20.xml流程图。 创建时名称只用输入myProcess 2.2.创建流程图 选中myProcess.bpmn20.xml,右…

多模态大模型

一、图文匹配 二、Stable-Diffusion(稳定扩散) 图片生成器 Stable-Diffusion(稳定扩散)组成模块: CrossAttention模块:将文本的语义信息与图像的语义信息进行Attention机制,增强输入文本Prompt对生成图片的控制。SelfAttention模块:SelfAttention模块的整体结构与C…

QT 小组件 列表框以及微调框

.cpp文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QListWidgetItem *pPhone new QListWidgetItem;pPhone->setText("西瓜");pPhone->…