【Android】组件化开发入门

文章目录

  • 引入
    • 组件是什么?
    • 为什么使用组件化开发?
    • 什么是模块化,组件化,插件化?
        • 常见实现
  • 组件分层
    • 创建module
  • 组件单独调试
    • 配置组件工程类型
    • 配置组件ApplicationId和AndroidManifest文件

引入

组件是什么?

组件(Component)是对数据和方法的一个封装,其核心特点包括功能单一、高内聚、低耦合、可复用。它通常是业务逻辑中最小的可划分单元,具备清晰的功能边界,方便集成到更大的应用中。

为什么使用组件化开发?

  1. 降低耦合度,提升代码维护性
  2. 提升开发效率,支持并行开发
  3. 优化编译速度
  4. 增强扩展性和灵活性
  5. 支持模块独立调试和测试
  6. 提升代码复用性

什么是模块化,组件化,插件化?

  1. 模块化(Modularization)

模块化是指将应用程序分解为多个功能模块,每个模块可以独立开发、测试和复用。这些模块通常会有各自的职责,比如“用户模块”、“支付模块”、“商品模块”等。模块化的目标是提升代码的可管理性和复用性。

常见实现

可以使用Gradle的多模块项目来实现模块化,每个模块可以是library或者feature module,各模块依赖于主应用模块(app module)或其他模块。

  1. 组件化(Componentization)

组件化是一种更高级的模块化,强调将应用拆分为多个独立的功能组件(组件可以理解为功能更聚焦的模块),这些组件可以独立运行、开发和测试,且具有更高的解耦性。组件化的目标不仅是分离代码,还能实现不同功能模块的相对独立和复用,比如组件可以在多个项目中共享。

  1. 插件化
  • 单位:插件(APK),通常是可以作为独立应用存在的模块。
  • 目标:通过将应用拆分成多个独立的APK文件,使得功能模块可以独立加载和卸载,支持热插拔和热更新。
  • 特点:
    • 插件化强调模块的完全独立性,每个插件都可以是一个完整的APK,可以在不重启主应用的情况下动态加载。
    • 适合需要动态加载和更新的场景,比如微信的“朋友圈”功能,可以单独作为一个APK文件动态下载、更新,并在主应用中加载。
    • 可以通过动态下载、热更新的方式,大大增强了应用的灵活性和扩展性。
特点模块化组件化插件化
侧重点项目内的业务功能划分功能的复用性和低耦合性功能的动态加载和热更新
耦合度较低更低极低(插件可以完全独立运行)
独立性模块之间不可独立运行每个组件通常可以独立运行每个插件通常是一个独立的APK
应用场景项目内部功能划分可在不同项目中共享的功能支持动态加载、热更新的应用场景
适用项目规模中小型项目大型项目或需要高复用性需求的项目需要频繁更新和动态扩展的大型项目
构建和调试依赖主应用,通常无法独立构建和调试可单独调试,利于开发效率插件可以独立构建和调试,支持动态加载
动态更新不支持动态更新不支持动态更新支持动态下载、热更新

实现要解决的问题

  1. 如何将项目工程进行分层?
  2. 如何实现单独运行调试?
  3. 组件间如何实现页面的跳转?
  4. 组件间如何实现组件间通信/方法调用?
  5. 组件的生命周期

组件分层

image-20241107104838442

创建module

业务组件层:

image-20241107165424455

image-20241107170911383

业务组件层和功能组件层

image-20241107171529946

image-20241107172133419

组件单独调试

在 Android 开发中,Gradle 插件可以配置不同类型的工程,主要有以下三种:

  1. App 插件 (com.android.application):

    • 用于创建可独立运行的 Android 应用程序。
    • 它将构建完整的 APK 文件,可以直接部署到设备或应用商店中。
    • 适合需要打包发布的应用开发项目。
  2. Library 插件 (com.android.library):

    • 用于构建 Android 库模块。
    • 构建输出是 AAR 文件(Android Archive),包含资源、代码等,但不能直接运行。
    • 适用于开发通用模块(如 UI 组件库、数据模块等),可在不同的 App 项目中复用。
  3. Test 插件 (com.android.test):

    • 专门用于构建测试模块,可以运行独立的测试代码。
    • 适合构建单独的测试模块,用于 UI 测试或集成测试等。
    • 一般情况下,这个插件主要在大型项目中使用,以实现独立的测试逻辑

配置组件工程类型

通过修改依赖的插件来配置工程的类型,让模块可以被单独调试,也可以被

在project的gradle.properties中加入

isRunAlone = true

为真时表示各个模块可以独立运行

然后在需要单独测试的模块中加入判断

if(isRunAlone.toBoolean()){apply plugin:'com.android.application'
}else {apply plugin:'com.android.library'
}

image-20241108221629578

这里成功运行了模块main的界面

配置组件ApplicationId和AndroidManifest文件

在组件单独调试和集成调试的不同模式下,自动调整一些配置,防止Application ID 冲突或者启动页冲突

1.配置AndroidManifest

image-20241108222725460

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.NeteaseMusiccomponet"><activityandroid:name=".MainActivity"></activity></application></manifest>

删掉

<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

2.配置ApplicationId和AndroidManifest

if (isRunAlone.toBoolean()) {apply plugin: 'com.android.application'
} else {apply plugin: 'com.android.library'
}android {namespace 'com.example.main'compileSdk 34defaultConfig {if (isRunAlone.toBoolean()) {applicationId "com.example.main"}minSdk 29targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}sourceSets{main{if(isRunAlone.toBoolean()){manifest.srcFile'src/main/debugmanifest/AndroidManifest.xml'}else {manifest.srcFile'src/main/AndroidManifest.xml'}}}...
}
...

加上如下代码,表示单独调试时添加applicationId,以及集成调试时使用的配置文件

if (isRunAlone.toBoolean()) {applicationId "com.example.main"
}
和
sourceSets{main{if(isRunAlone.toBoolean()){manifest.srcFile'src/main/debugmanifest/AndroidManifest.xml'}else {manifest.srcFile'src/main/AndroidManifest.xml'}}
}

这样就实现了需要集成调试将gradle.properties修改为false,可以正常运行



感谢您的阅读
如有错误烦请指正


参考:

  1. Android 组件化最佳实践在项目的开发过程中,随着开发人员的增多及功能的增加,如果提前没有使用合理的开发架构,那么代 - 掘金 (juejin.cn)
  2. Android组件化开发实践(二):组件化架构设计 - 简书 (jianshu.com)

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

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

相关文章

MySQL数据库基础(一) MySQL安装及数据类型

目录 一、MySQL数据裤简介 二、MySQL数据的安装 2.1、MySQL安装 2.2、修改MySQL密码登录策略 三、数据库基础管理 3.1、连接方式及数据储存流程 3.2、库管理命令 3.3、表管理命令 3.4、记录管理命令 四、MySQL数据类型 4.1、常见信息种类 4.2、字符型 4.3、数值型 4.4、日期时间…

云原生+AI核心技术&最佳实践

以下内容是我在陕西理工大学2023级人工智能专业和网络专业的演讲内容&#xff0c;分享给大家。 各位老师、同学们&#xff0c;大家好啊&#xff01;能在这里跟大家一起聊聊咱们计算机专业那些事儿&#xff0c;我真的觉得超级兴奋&#xff01; 首先&#xff0c;自我介绍一下&am…

Qt QCustomplot 在采集信号领域的应用

文章目录 一、常用的几种开源库:1、QCustomPlot:2、QChart:3、Qwt:QCustomplot 在采集信号领域的应用1、应用实例时域分析频谱分析2.数据筛选和处理其他参考自然界中的物理过程、传感器和传感器网络、电路和电子设备、通信系统等都是模拟信号的来源。通过可视化模拟信号,可以…

C++11的简介

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 一列表初始化的变化&#xff1a; 二左右值即各自引用的概念&#xff1a; 2.1左右…

大模型的常用指令格式 --> ShareGPT 和 Alpaca (以 llama-factory 里的设置为例)

ShareGPT 格式 提出背景&#xff1a;ShareGPT 格式起初来自于用户在社交平台上分享与聊天模型的对话记录&#xff0c;这些记录涵盖了丰富的多轮对话内容。研究者们意识到&#xff0c;这类真实的对话数据可以帮助模型更好地学习多轮对话的上下文保持、回应生成等能力。因此&…

5G时代已来:我们该如何迎接超高速网络?

内容概要 随着5G技术的普及&#xff0c;我们的生活似乎变得更加“科幻”了。想象一下&#xff0c;未来的智能家居将不仅仅是能够听你说“开灯”&#xff1b;它们可能会主动询问你今天心情如何&#xff0c;甚至会推荐你一杯“维他命C芒果榨汁”&#xff0c;帮助你抵御夏天的炎热…

Unity SRP学习笔记(二)

Unity SRP学习笔记&#xff08;二&#xff09; 主要参考&#xff1a; https://catlikecoding.com/unity/tutorials/custom-srp/ https://docs.unity.cn/cn/2022.3/ScriptReference/index.html 中文教程部分参考&#xff08;可选&#xff09;&#xff1a; https://tuncle.blog/c…

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期

目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …

粤荣学校与亲邻家政达成合作,创造双向人才输送机制

原标题&#xff1a;超过大学生月薪&#xff01;粤荣学校与亲邻家政达成合作&#xff0c;创造双向人才输送机制&#xff0c;解决中年人就业难题&#xff01; 广州市白云区粤荣职业培训学校余智强校长与广州亲邻家政服务有限公司朱利生经理于2024年11月8日下午共同签署了一份重要…

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器&#xff0c;可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件&#xff0c;则跳过这一步。如果手上有ppk文件&#xff0c;那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式&#xff0c;你需要将 PPK 文…

parseInt 是一个内置的 JavaScript 函数,用于将字符串转换为整数。

parseInt(options.checkNumber, 10) 中的 10 表示将字符串转换为十进制整数。 解释 parseInt 函数&#xff1a; parseInt 是一个内置的 JavaScript 函数&#xff0c;用于将字符串转换为整数。它有两个参数&#xff1a; 第一个参数是要转换的字符串。第二个参数是转换时使用的基…

鸿蒙ArkTS中的布局容器组件(Scroll、List、Tabs)

1、Scroll组件 Scroll组件是一个可滚动的容器组件&#xff0c;用于在子组件的布局尺寸超过父组件尺寸时提供滚动功能。它允许在其内部容纳超过自身显示区域的内容&#xff0c;并通过滚动机制来查看全部内容。这对于显示大量信息&#xff08;如长列表、长篇文本或大型图像等&…

ElasticSearch备考 -- Manage the index lifecycle (ILM)

一、题目 在集群中&#xff0c;数据首先分布在data_hot节点&#xff0c;rollover 设置max_age:3d, max_docs:5,max_size:50gb, 优先级为100。 max_age:15s, forcemarge 段合并&#xff0c;数据迁移到data_warm节点&#xff0c; 副本数为0&#xff0c;优先级为50 max_age:30s, 数…

信息安全工程师(81)网络安全测评质量管理与标准

一、网络安全测评质量管理 遵循标准和流程 网络安全测评应严格遵循国家相关标准和流程&#xff0c;确保测评工作的规范性和一致性。这些标准和流程通常包括测评方法、测评步骤、测评指标等&#xff0c;为测评工作提供明确的指导和依据。 选择合格的测评团队 测评团队应具备相关…

使用 Python 构建代理池并测试其有效性

前言 在本篇文章中,我们将介绍如何通过 Python 脚本来构建一个代理池,并且对这些代理的有效性进行测试。整个流程涵盖了从网站抓取代理信息、存储这些信息以及异步地测试代理的有效性。这个脚本可以用作网络爬虫或其他需要使用代理服务器的应用的基础工具。 目标网站 一、…

设计者模式之策略模式

前言 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xff0c;如果将这些算法都写在对象中&#xff0c;将会使对象变得异常复杂&#xff1b;而且有时候支持不频繁使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算…

tomcat 开启远程debug模式

1.修改位置 CATALINA_OPTS"-Xdebug -Xrunjdwp:transportdt_socket,address*:8000,servery,suspendn"2.修改环境变量的方式 apache-tomcat-9.0.86/bin/setenv.sh export JAVA_HOME/opt/jdk1.8.0_171 export CATALINA_HOME/opt/apache-tomcat-9.0.86 export JAVA_OP…

AI辅助论文写作的利弊

人工智能的时代&#xff0c;AI从自动驾驶到智能家居&#xff0c;慢慢的都成为了我们生活中的一部分。可当AI被放到学术研究领域&#xff0c;特别是撰写论文这一问题上时&#xff0c;却出现了大量的争议&#xff0c;认为AI撰写论文会削弱该有的批判性思维能力。那不用AI撰写论文…

vue3+less使用主题定制(多主题定制)可切换主题

假如要使用两套主题&#xff1a;蓝色、红色 例如&#xff1a; 首先确保自己的vue3项目有less&#xff0c;这边不多做接入解释 1、在src目录下建一个styles文件夹&#xff0c;在syles文件夹下面新建两个less文件&#xff1a;theme.less和variables.less&#xff1b; theme.le…

后端Node学习项目-项目基础搭建

前言 各位好&#xff0c;我是前端SkyRain。最近为了响应公司号召&#xff0c;开始对后端知识的学习&#xff0c;作为纯粹小白&#xff0c;记录下每一步的操作流程。 项目仓库&#xff1a;https://gitee.com/sky-rain-drht/drht-node 因为写了文档&#xff0c;代码里注释不是很…