【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">

    <application
        android: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">
        <activity
            android: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 34

    defaultConfig {
        if (isRunAlone.toBoolean()) {
            applicationId "com.example.main"
        }
        minSdk 29
        targetSdk 34
        versionCode 1
        versionName "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)

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

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

相关文章

Ubuntu 系统端口查询与管理详细分析

目录 前言1. 查询端口占用情况2. 释放占用的端口3. 修改应用程序的端口 前言 Window的端口被占用&#xff0c;类似的知识点&#xff1a;重装mysql时3306端口被占用解决方法 事情起因是宝塔的CPU负载过大&#xff0c;重启服务进程之后还是爆&#xff0c;后续发现是端口被占用&…

从0学习React(11)

1. 引言 上个星期的工作内容是写IT资产管理的前端页面。其实&#xff0c;尽管我之前有一些前端开发的经验&#xff0c;但并不是很多。这次让我独立完成一个页面的开发&#xff0c;刚开始时我感到无从下手。 2. 初期的困惑和焦虑 我记得在星期一和星期二的时候&#xff0c;那…

边缘计算与推理算力:智能时代的加速引擎

在数据量爆炸性增长的今天&#xff0c;边缘计算与推理算力正成为推动智能应用的关键力量。智能家居、自动驾驶、工业4.0等领域正在逐步从传统的云端计算转向边缘计算&#xff0c;而推理算力的加入&#xff0c;为边缘计算提供了更强的数据处理能力和实时决策能力。本文将探讨边缘…

基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究

摘要&#xff1a;本文探讨了完善适配视频号交易小程序的重要意义&#xff0c;重点阐述了开源 AI 智能名片 S2B2C 商城小程序在这一过程中的应用。通过分析其与直播间和社群的无缝衔接特点&#xff0c;以及满足新流量结构下基础设施需求的能力&#xff0c;为门店在视频号直播交易…

深度学习知识点2-SENet(Squeeze-and-Excitation Networks)

作者的动机&#xff1a;希望显式地建模特征通道之间的相互依赖关系。 具体方法&#xff1a;并未引入新的空间维度来进行特征通道间的融合&#xff0c;而是采用了一种全新的「特征重标定」策略。通过学习的方式来自动获取到每个特征通道的重要程度&#xff0c;然后依照这个重要…

vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局

vue elementui 固定顶部、左侧菜单与面包屑&#xff0c;自适应 iframe 页面布局 疑问点&#xff1a;iframe无法高度100%&#xff0c;如果写了100%就会有滚动条&#xff0c;所以只写了99.5% 【效果图】 路由示例 const routes [{title: Index,path: /,name: "Index"…

在配置环境变量之后使用Maven报错 : mvn : 无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

最近&#xff0c;我在 Windows 系统上安装和配置 Apache Maven 时遇到了一些问题&#xff0c;想在此记录下我的解决历程&#xff0c;希望对遇到类似问题的朋友有所帮助。 问题描述 我下载了 Maven 并按照常规步骤配置了相关的环境变量。然而&#xff0c;在 PowerShell 中输入…

java数据结构与算法:栈

栈 1、栈的基本概念2、Java模拟简单的顺序栈实现3、增强功能版栈4、利用栈实现字符串逆序5、利用栈判断分隔符是否匹配6、总结 1、栈的基本概念 **栈&#xff08;英语&#xff1a;stack&#xff09;**又称为堆栈或堆叠&#xff0c;栈作为一种数据结构&#xff0c;是一种只能在…

【Linux篇】面试——用户和组、文件类型、权限、进程

目录 一、权限管理 1. 用户和组 &#xff08;1&#xff09;相关概念 &#xff08;2&#xff09;用户命令 ① useradd&#xff08;添加新的用户账号&#xff09; ② userdel&#xff08;删除帐号&#xff09; ③ usermod&#xff08;修改帐号&#xff09; ④ passwd&…

java/SpingBoot

后端&#xff1a;使用MyBatis与数据库相连。 下载安装apache-maven 配置apache-maven管理工具

基于yolov8、yolov5的番茄成熟度检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;番茄成熟度检测在农业生产及质量控制中起着至关重要的作用&#xff0c;不仅能帮助农民及时采摘成熟的番茄&#xff0c;还为自动化农业监测提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的番茄成熟度检测模型&#xff0c;该模型使用了…

从“大吼”到“轻触”,防爆手机如何改变危险油气环境通信?

众所周知&#xff0c;在加油站用手机打电话是被明令禁止的&#xff0c;这是因为手机内部会产生静电或射频火花&#xff0c;可能点燃空气中的油气混合物&#xff0c;导致爆炸或火灾。那么加油站的工作人员如何交流呢&#xff1f;以前他们靠吼&#xff0c;现在有了防爆手机&#…

PICO+Unity MR空间锚点

官方链接&#xff1a;空间锚点 | PICO 开发者平台 注意&#xff1a;该功能只能打包成APK在PICO 4 Ultra上真机运行&#xff0c;无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上&#xff0c;勾选…

OneRestore: A Universal Restoration Framework for Composite Degradation 论文阅读笔记

这是武汉大学一作单位的一篇发表在ECCV2024上的论文&#xff0c;文章代码开源&#xff0c;文章首页图如下所示&#xff0c;做混合图像干扰去除&#xff0c;还能分别去除&#xff0c;看起来很牛逼。文章是少见的做混合图像干扰去除的&#xff0c;不过可惜只包含了3种degradation…

2.vue编写APP组件

二、编写APP组件 2.1基本语法 1&#xff09;先把src里的默认文件删掉 2&#xff09;创建main.ts和App.vue这两个文件 <!--App.vue--><!-- 组件结构 --> <template><div class"app"><h1>Hello Vue</h1></div> </temp…

工业相机选取

1.相机分类&#xff1a; 1.1 在相机曝光方式中&#xff0c;全局曝光和卷帘曝光是两种主流技术。CCD相机通常采用全局曝光方式&#xff0c;而CMOS相机则可能采用卷帘曝光。 面阵相机与全局曝光关联与区别 关联&#xff1a;面阵相机可以使用全局曝光作为曝光方式&#xff0c;但…

进入未来城:第五周游戏指南

欢迎来到 Alpha 第 4 季第五周&#xff01; 走进霓虹闪烁的未来城街道&#xff0c;这是一座科技至上的赛博朋克大都市。鳞次栉比的摩天大楼熠熠生辉&#xff0c;拥挤的街道下则是阴森恐怖的地下世界。在这里&#xff0c;像激光鹰队长这样的超级战士正在巡逻&#xff0c;而 Ago…

C++ 错题本 MAC环境下 unique_lock try_lock_for函数爆红问题

下方是一个非常简单的&#xff0c;尝试使用unique_lock去尝试加锁的示例代码&#xff0c;在调用try_lock_for函数的时候爆红。这个函数本来就是按照编辑器提示点出来的&#xff0c;不可能没有这个方法 &#xff0c;比较奇怪。 报错如图所示&#xff1a; 运行的时候编译器报错…

华为大咖说 | 浅谈智能运维技术

本文分享自华为云社区&#xff1a;华为大咖说 | 浅谈智能运维技术-云社区-华为云 本文作者&#xff1a;李文轩 &#xff08; 华为智能运维专家 &#xff09; 全文约2695字&#xff0c;阅读约需8分钟 在大数据、人工智能等新兴技术的加持下&#xff0c;智能运维&#xff08;AI…

ollama+springboot ai+vue+elementUI整合

1. 下载安装ollama (1) 官网下载地址&#xff1a;https://github.com/ollama/ollama 这里以window版本为主&#xff0c;下载链接为&#xff1a;https://ollama.com/download/OllamaSetup.exe。 安装完毕后&#xff0c;桌面小图标有一个小图标&#xff0c;表示已安装成功&…