Android组件化实现,理解吸收

news/2024/5/5 11:33:11/文章来源:https://blog.csdn.net/2301_76813281/article/details/133995757

什么是组件化?

一个大型APP版本一定会不断的迭代,APP里的功能也会随之增加,项目的业务也会变的越来越复杂,这样导致项目代码也变的越来越多,开发效率也会随之下降。并且单一工程下代码耦合严重,每修改一处代码后都要重新编译,非常耗时,单独修改的一个模块无法单独测试。

组件化架构的目的是让各个业务变得相对独立,各个组件在组件模式下可以独立开发调试,集成模式下又可以集成到“app壳工程”中,从而得到一个具有完整功能的APP。

组件化每一个组件都可以是一个APP可以单独修改调试,而不影响总项目。

为什么使用组件化?

编译速度: 可以但需测试单一模块,极大提高了开发速度 超级解耦: 极度降低了模块间的耦合,便于后期的维护和更新 功能重用: 某一块的功能在另外的组件化项目中使用只需要单独依赖这一模块即可 便于团队开发: 组件化架构是团队开发必然会选择的一种开发方式,它能有效的使团队更好的协作

组件化实现

一、建立项目

我们新建一个moduleLearn的项目,这里面我们再新建几个module。module的建立是 file- > new module。

这里说明一下,我们建立了chat、contract、home这三个module,它们三个在建立的时候选择Phone & Tablet module模式。这三个模块, 就是我们要独立进行开发的。

commonlib在建立的时候,选择Android Library,它是做为公共组件存在

二、添加变量

让各组件可以根据变量值的变化来确定是否可以独立开发

在项目的根目录下,找到gradel.properties文件,在里面写下

#是否需要单独编译 true表示不需要 false表示需要

isNeedHomeModule = true
isNeedChatModule = true
isNeedContractModule = true

三、在各个子组件的build.gradle中进行修改

1,在头部进行修改

//根据是否独立运行,来改变module
if(!isNeedHomeModule.toBoolean())
{apply plugin: 'com.android.application'
}else{apply plugin: 'com.android.library'
}

2, android-> defaultConfig中的内容

android {compileSdkVersion 28defaultConfig {//独立运行时,添加applicatonif(!isNeedHomeModule.toBoolean()) {applicationId "com.cg.home"}minSdkVersion 21targetSdkVersion 28versionCode 1versionName "1.0"}

三、修改各子组件的androidmanifest.xml文件

在src -> main 下面建立manifest文件夹,在里面再建立一个androidmanifest.xml文件,把外面的androidmanifest.xml的内容复制一份进来,并修改外面的androidmanifest.xml内容,修改什么呢,就是把默认的启动页去掉。

<?xml version="1.0" encoding="utf-8"?><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/AppTheme"><activity android:name=".MainActivity"></activity>
</application>

下面是正常的androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.cg.home"><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/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

现在看到区别了吧,为什么要改这里呢,这里你不改的话,可以试一下,在不进行独立开发的时候,你一安装app,会有多个启动页面,这样就会在手上出现多个app的进入图标。

添加完androidmanifest.xml后,我们要去修改build.gradle文件,在android中添加

sourceSets{main{//这里我只是用home做的例子,每个module都要进行改,要判断相应的判断if(!isNeedHomeModule){manifest.srcFile 'src/main/manifest/AndroidManifest.xml'}else{manifest.srcFile 'src/main/AndroidManifest.xml'}}}

四,去主app的build.gradle中添加引用

if(isNeedChatModule.toBoolean()){implementation project(':chat')}if(isNeedContractModule.toBoolean()){implementation project(':contract')}if(isNeedHomeModule.toBoolean()){implementation project(':home')}implementation project(':commonlib')

当进行独立开发的时候,就需要进行引用。

好,到这里,组件化就算处理完成了,运行一下,就可以看到,只要修改gradle.properties里面我们自定义的变量值,就可以实现是否独立开发了。

下面我们来看一下,ARouter的引用与使用。

我们定义了commonlib的作用就是为了能做共用的代码提取出来,但是ARouter里面的一些代码,却无法放到这里,不然总是会提示你错误。这算是一个坑吧。

现在我们把ARouter怎么引入做一个说明

一、所有module都引用一个commonlib。

二、在commonlib的buile.gradle中引入

compile "com.alibaba:arouter-api:1.5.0"

当然了,你可以不放在dommlib中,在每个module中独立加也行

三、在每个module中引入

annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

同时,在android -> defaultConfig中添加

android {compileSdkVersion 28defaultConfig {applicationId "com.cg.modulelearn"minSdkVersion 21targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//这里就是ARouter的引用javaCompileOptions {annotationProcessorOptions {arguments = [AROUTER_MODULE_NAME: project.getName()]}}}

这里要注意主app中也要添加

四、初始化ARouter是在主app中,定义一个我们自己的myAppllication.

public class myApplication extends Application {@Overridepublic void onCreate() {super.onCreate();initRouter();}private void initRouter() {if(BuildConfig.DEBUG){ARouter.openLog();ARouter.openDebug();}ARouter.init(this);}
}

这样就集成完了,现在看一下,如何跳转与传值。

一、在子module中我们要进行注解

//这里注意,这时必须是二级目录,这里写的path就是在主app中要调用的跳转路径
@Route(path="/home/main")
public class MainActivity extends AppCompatActivity {private TextView txt_homeTitle;//这里的title值,就是要传入的值,前面必须加上@Autowired@Autowiredpublic String title;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_homemain);//将页面注入到ARouter中ARouter.getInstance().inject(this);Log.e("MainActivity.java(onCreate)", "行数: 25  title:" + title);initControls();}/*** 初始化控件*/private void initControls() {txt_homeTitle = (TextView)findViewById(R.id.txt_homeTitle);txt_homeTitle.setText(title);}}

主app中的代码

public class MainActivity extends AppCompatActivity {private Button btn_home;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//ARouter.getInstance().inject(this);initControls();}/*** 初始化控件*/private void initControls() {btn_home = (Button)findViewById(R.id.btn_home);btn_home.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ARouter.getInstance().build("/home/main").withString("title","主app传过来的HOME名字").navigation();}});}
}

到此完成。这里只是简单的做一个使用记录。全文主要讲了在Android开发当中的组件化技术,以上是对组件化一个简单的介绍和理解以及组件化实现案例。更多有关Android组件化学习或进阶Android架构技术,可以参考《Android核心技术手册》点击可以查看详细栏内容。

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

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

相关文章

朋友圈营销攻略:定时发送、互动与延迟评论

在社交媒体时代&#xff0c;朋友圈成为了人们交流和展示自己的重要平台。越来越多的人利用朋友圈进行营销&#xff0c;吸引更多的关注和客户。那么&#xff0c;如何在朋友圈进行有效的营销呢&#xff1f;小编给大家介绍一款微信管理系统&#xff0c;他具有非常强大的朋友圈功能…

不会用PS抠图?教你懒人抠图法,必须学会!

相信很多小伙伴都有遇到这样的窘境——好不容易找到得素材图片&#xff0c;中间的图案很好看&#xff0c;可是特别想去掉后面的背景&#xff0c;应该如何抠图呢&#xff1f; 能够将图片中的物品或人物抠出来是一种很有用的技巧&#xff0c;可以在很多场景下应用&#xff0c;比…

AUTOSAR 包 MC-ISAR 安装指南

安装程序和Tresos配置概念适用于所有AURIX产品。 一、安装包命名规则 二、安装包定义 三、名词缩写 四、安装过程 以 BASE package 安装过程为例。 1、运行MC-ISAR_AS<xxx>_AURIX_TC<con>_<Step>_PB_BASE_V<nnn>.exe。 对于TC29x版本&#xff1a;运…

数字化转型“黑话”知多少?一文让你不仅听得懂、还会落地执行

何为OEE&#xff1f;如何提升OEE&#xff1f; 从上图可知&#xff0c;客户是机加工行业的&#xff0c;而机加工行业属于重资产行业&#xff0c;主要以设备生产为主&#xff0c;管好设备、提升设备的综合效率&#xff08;OEE&#xff09;。效率高了&#xff0c;毛利率自然也会增…

程序设计(2023年10月)

函数传参有三种方式&#xff1a;值传递&#xff0c;地址传递&#xff0c;引用传递 排序算法&#xff1a;见下文八大排序 数据结构—八大排序_数据结构排序-CSDN博客

HNSW-分层可导航小世界 算法学习

一、knn的缺陷 1. K-NN方法的工作机制 K-Nearest Neighbors (K-NN) 是一种基于实例的分类方法。它通过逐一比较新样本与已有样本的相似度&#xff0c;挑选出与新样本最接近的k个已有样本&#xff0c;然后根据这些样本的类别&#xff0c;通过投票或加权的方式来决定新样本的类…

塔望3W消费战略全案丨轻食植物基,突围侧翼战

植鲜生 客户&#xff1a;民强&#xff08;昆山&#xff09;食品科技有限公司 品牌&#xff1a;植鲜生 时间&#xff1a;2021年起 项目部分内容保密期 突破传统植物基禁锢 破局轻食新赛道 民强&#xff08;昆山&#xff09;食品科技有限公司是一家集研发、生产、销售为一体…

VLAN互通

文章目录 VLAN互通2种方法单臂路由实现VLAN互通TOP图配置-LSW配置-Router1测试&#xff1a;PC1PC2 VLANIF(更受欢迎)TOP图LSW2配置测试PC1 VLAN互通2种方法 单臂路由实现VLAN互通 TOP图 名称IPGatewayPC1192.168.1.1/24192.168.1.254PC2192.168.2.1/24192.168.2.254 名称VLA…

软设上午题错题知识点8

软设上午题错题知识点8 1、IPv4用32位二进制表示&#xff0c;能够表示的地址空间是232&#xff0c;IPv6用128位二进制表示&#xff0c;能够表示的地址空间是2128&#xff0c;本题选择2128 /232296 。 2、在应用散列函数构造哈希表&#xff08;或散列表&#xff09;时&#xf…

AI智慧安防智能监控平台EasyCVR隔天设备录像播放失败是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTMP、RTSP、HTTP-FLV、…

Ubuntu 下 VSCode Tab 间距非常小解决方案

Ubuntu 的 Tag 键很小&#xff0c;不利于阅读代码&#xff0c;检查 Tab Size 配的也没问题&#xff0c;也是4 解决方案为&#xff1a; 进入 设置-> 字体&#xff0c;把 红框中的 ‘Droid Sans Mono’, 删了 修改后如下&#xff1a; 再次回到代码界面&#xff0c;可以…

品牌公关稿件怎么写?纯干货

品牌公关稿件成为了各大企业传播价值观、提升品牌形象的重要手段。然而&#xff0c;如何撰写一篇高质量的、吸引人的品牌公关稿件却让许多人头疼不已。本文伯乐网络传媒将从选题、结构、语言、传播等方面&#xff0c;为您详细解析品牌公关稿件的写作技巧&#xff0c;帮助您轻松…

软考-流量分析

扫描技术是网络攻防的一种重要手段&#xff0c;在攻和防当中都有其重要意义。nmap是一个开放源码的网络扫描工具&#xff0c;可以查看网络系统中有哪些主机在运行以及哪些服务是开放的。 nmap工具的命令选项:sS 用于实现SYN扫描&#xff0c;该扫描类型是通过观察开放端口和关闭…

打包Qt程序,自动添加依赖的库和文件(详细步骤)

1、打开对应版本的命令面板&#xff0c;选择即可&#xff1a; 一般安装qt的时候&#xff0c;都会自带的 2、进入到编译成功的程序所在的目录&#xff1a; 输入&#xff1a;windeployqt XXX.exe&#xff08;实际的程序名字&#xff09; 这样这个程序所依赖的库都会自动添加进来…

【计算机网络】UDP的报文结构和注意事项

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的协议&#xff0c;它在传输层中提供了简单、不可靠的数据传输服务。与TCP&#xff08;Transmission Control Protocol,传输控制协议&#xff09;不同&#xff0c;UDP不需要建立连接&…

未能为 SSL/TLS 安全通道建立信任关系

在 Windows早期版本&#xff08;Windows server 2008&#xff09;上运行web请求相关代码&#xff0c;提示错误&#xff1a;未能为 SSL/TLS 安全通道建立信任关系。 打开IE直接访问相关网址&#xff0c;按照提示信任网站&#xff0c;安装证书&#xff1a; 选择&#xff1a;将所有…

vue2中,下拉框多选和全选的实现

vue2中&#xff0c;下拉框多选和全选的实现 代码布局在methods: 中添加功能函数较为完整的一个整体代码&#xff1a; 如图所示点击全选即可完成下拉框中全部子项的全部的选中&#xff0c;同时取消全选即可全部取消选择。 代码布局 <div class"chos-box2"><…

MySQL恢复不小心误删的数据记录(binlog)-生产实操

同事操作删除生产数据时&#xff0c;未及时备份导致误删除部份数据。现通过mysql的binlog日志回滚数据。 1.由于我们第一时间找到相应的操作时间的大概在12点~13点之间操作删除了product和product_item表的部份数据。因此我们只要找到这期间的binlog文件就行了&#xff0c; 脚…

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二&#xff1a;人脸表情识别-VGG16实现 本文为&#x1f517;小白入门Pytorch内部限免文章 参考本文所写记录性文章&#xff0c;请在文章开头注明以下内容&#xff0c;复制粘贴即可 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参…

系统性认知网络安全

前言&#xff1a;本文旨在介绍网络安全相关基础知识体系和框架 目录 一.信息安全概述 信息安全研究内容及关系 信息安全的基本要求 保密性Confidentiality&#xff1a; 完整性Integrity&#xff1a; 可用性Availability&#xff1a; 二.信息安全的发展 20世纪60年代&…