【Android】组件化开发入门

news2024/11/15 4:11:12

文章目录

  • 引入
    • 组件是什么?
    • 为什么使用组件化开发?
    • 什么是模块化,组件化,插件化?
        • 常见实现
  • 组件分层
    • 创建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)

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

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

相关文章

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤&#xff0c;这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口&#xff0c;完全找不到可供参考的例子。如果不需要传递什么参数&#xff0c;就能获取到结果&#xff0c…

鸿蒙 入门——ArkUI 自定义组件间的“后代“双向同步@Provide和@Consume装饰器小结(五)

文章大纲 引言一、Provide和Consume装饰器概述1、Provide和Consume关系的绑定2、使用规则3、变量的传递/访问规则4、支持的观察变化的场景5、Provide和Consume变量的值初始化和更新机制5.1、初始渲染5.2、当Provide装饰的数据变化时&#xff1a;5.3、当Consume装饰的数据变化时…

【MySQL从入门到放弃】InnoDB磁盘结构(一)

前言 从MySQL 5.5版本开始默认 使用InnoDB作为引擎&#xff0c;它擅长处理事务&#xff0c;具有自动崩溃恢复的特性&#xff0c;在日常开发中使用非常广泛。 下面是官方的InnoDB引擎架构图&#xff0c;主要分为内存结构和磁盘结构两大部分。 上一篇文章&#xff0c;我们解析了…

C哈的刷题计划之输出数字螺旋矩阵(1)

1、盲听C哈说 都说数据结构与算法是编程的核心&#xff0c;它们两个是内功与心法&#x1f600;&#xff0c;其它编程工具只是招式&#xff0c;学会了内功与心法&#xff0c;学习新事物&#xff08;这里特指层出不穷的IT技术&#xff09;就没有那么难了&#xff0c;实际上&#…

cv::RotatedRect::points误差较大

最后发现不是point的精度问题&#xff0c;float不至于产生这么大误差&#xff0c;是自己代码里缓存了顶点坐标&#xff0c;后面由手动修改了旋转矩形的角度&#xff0c;导致不匹配&#xff01; 下文可以忽略了-_-! 发现一个天坑&#xff0c;通过高宽和角度构造了一个旋转矩形 …

ThinkServer SR658H V2服务器BMC做raid与装系统

目录 前提准备 一. 给磁盘做raid 二. 安装系统 前提准备 磁盘和系统BMC地址都已经准备好&#xff0c;可正常使用。 例&#xff1a; 设备BMC地址&#xff1a;10.99.240.196 一. 给磁盘做raid 要求&#xff1a; 1. 将两个894G的磁盘做成raid1 2. 将两块14902G的磁盘各自做…

7天用Go从零实现分布式缓存GeeCache(学习)(2)

参考:https://geektutu.com/post/geecache-day2.html // Cache 是一个 LRU 缓存&#xff08;最近最少使用缓存&#xff09;&#xff0c;它不是并发安全的。 type Cache struct { maxBytes int64 // 缓存的最大字节数 nbytes int64 …

Ajax 与 Vue 框架应用点——随笔谈

老式 在老式的技术中&#xff0c;一个网页通常由前端工程师直接使用 HTML、CSS、JavaScript 编写而成 这种方式的优点很明显&#xff1a;简单粗暴&#xff0c;方便工程师以简单的思维完成工作 当然&#xff0c;缺点也很明显&#xff0c;包括但不限于&#xff1a; 直接原生开发…

鸿蒙动画开发06——打断动画

1、前 言 UI界面除了运行动画之外&#xff0c;还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时&#xff0c;UI界面应做到即时响应。 例如用户在应用启动过程中&#xff0c;上滑退出&#xff0c;那么启动动画应该立即过渡到退出动画&#xff0c;而不应该…

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server &#xff1a;服务注册中心…

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种架构模式&#xff0c;广泛应用于现代前端开发&#xff0c;尤其是在微软的WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中。它旨在通过将视图&#xff08;UI&#xff09;与业务逻辑&#xff08;…

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION

SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐&#xff0c;可以是书籍&#xff0c;可以是运动&#xff0c;可以是工作&#xff0c;可以是山川湖海&#xff0c;唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

/// ts中的三斜线指令 | 前端

第一次看到注意到这行代码&#xff0c;不知道的还以为是注释呢&#xff0c;查了资料才知道这是typescript中的三斜线指令&#xff0c;那有什么作用呢&#xff1f; 1. 这行代码是TypeScript中的一个三斜线指令&#xff08;Triple-Slash Directive&#xff09;&#xff0c;用于…

学习日记_20241110_聚类方法(K-Means)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

SMA-BP基于黏菌算法优化BP神经网络时间序列预测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

ssm103宠物领养系统+vue(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 宠物领养系统的设计与实现 学生姓名&#xff1a; 二级学院&#xff1a; 班级名称&#xff1a; 指导教师&#xff1a; 年 月 日 录 摘 …

Elasticsearch如果集群出现节点故障,我应该如何快速定位问题?

当 Elasticsearch (ES) 集群发生故障时&#xff0c;快速定位问题源头非常重要。Elasticsearch 是一个分布式系统&#xff0c;故障可能由多种原因引起&#xff0c;涉及到硬件、配置、网络、集群本身的健康状况等多个层面。以下是一些定位问题的步骤和工具&#xff1a; 检查集群…