Android组件化实现,理解吸收

news2024/10/5 18:30:25

什么是组件化?

一个大型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 28
    defaultConfig {
   		//独立运行时,添加applicaton
        if(!isNeedHomeModule.toBoolean()) {
            applicationId "com.cg.home"
        }
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

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

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



<?xml version="1.0" encoding="utf-8"?>


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


    <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/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 28
    defaultConfig {
        applicationId "com.cg.modulelearn"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "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 {


    @Override
    public 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
    @Autowired
    public String title;


    @Override
    protected 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;


    @Override
    protected 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() {
            @Override
            public void onClick(View v) {
                ARouter.getInstance().build("/home/main")
                        .withString("title","主app传过来的HOME名字")
                        .navigation();
            }
        });
    }
}

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

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

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

相关文章

C++:多态的内容和底层原理

文章目录 多态的概念多态的定义虚函数override和final关键字重载、覆盖、隐藏 抽象类抽象类的定义接口继承和实现继承 多态的原理解析虚函数表 本篇总结C中多态的基本内容和原理实现和一些边角内容 多态的概念 首先要清楚多态是什么&#xff0c;是用来做什么的&#xff1f; …

Windows桌面便笺 - 置顶任务TODO - 便利贴工具

效果图 一直置顶 免费 步骤 1. 打开便笺 win10找不到自带的便签怎么办-百度经验win10找不到自带的便签怎么办,很多朋友都在问wi10找不到自带的便签怎么办&#xff0c;今天就来给大家介绍一下wi10找不到自带的便签怎么办的方法。https://jingyan.baidu.com/article/b2c186c8…

小红书品牌账号怎么运营,如何传播规划?

其实新品牌面对的肯定都是新客户&#xff0c;对于新客户来说&#xff0c;真诚永远是最大的必杀技&#xff0c;所以在这告诉各位新兴品牌&#xff0c;少点套路&#xff0c;那么小红书品牌账号怎么运营&#xff0c;如何传播规划呢&#xff1f; 一、对品牌账号进行定位 定位方面一…

第一章初识Maven与Maven安装配置——尚硅谷

文章目录 Maven是什么Maven 作为构建管理工具依赖管理使用Maven的好处JAR包的规模JAR包的来源JAR包之间的依赖关系 Maven 开发环境配置Maven的下载Maven的解压配置setting.xml配置文件指定本地仓库配置镜像仓库Maven仓库的概念 配置基础 JDK 版本配置环境变量配置JDK环境配置Ma…

现在大火的低代码是怎么回事?进来聊聊低代码

一、前言 开发过程中&#xff0c;只是觉得前端后端合起来&#xff0c;有很多冗余信息&#xff0c;被代码一遍遍重复表达&#xff0c;是一件很枯燥、无聊的事情。 这些枯燥的重复工作&#xff0c;完全可以由机器来做&#xff0c;以便解放出我们的时间&#xff0c;来做更有价值的…

谷歌云的利润增长才刚刚开始

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;自从Google Cloud(谷歌云&#xff09;今年开始盈利以来&#xff0c;投资者都在怀疑这种盈利能力能否持续下去。 &#xff08;2&#xff09;虽然微软Azure目前在全球的人工智能竞…

Python 学习(day04)

函数进阶 获得多个返回值

“微信小程序登录与用户信息获取详解“

目录 引言微信小程序微信登录介绍1. 微信登录的基本概念2. 微信小程序中的微信登录 微信小程序登录的wxLogin与getUserProfile的区别1. wx.login()2. wx.getUserProfile()3.两者区别 微信小程序登录的理论概念1. 微信登录流程2. 用户授权与登录态维护 微信小程序登录的代码演示…

【计算机网络】HTTP 协议的基本格式以及 fiddler 的用法

HTTP协议的基本格式如下&#xff1a; 1.请求行&#xff1a; 包括请求THHP协议的版本、请求URI&#xff08;资源路径&#xff09;和HTTP方法&#xff08;如GET、POST、PUT、DELETE等&#xff09; GET/example.html HTTP/1.1 GET表示请求方法&#xff0c;/example.html表示请求的…

视频如何批量添加水印?简单几步帮你解决问题

在如今这个短视频横行的时代&#xff0c;我们常常需要在短视频中添加个人logo或水印来保护知识产权和增加品牌曝光度。如果你有很多视频需要添加水印&#xff0c;那么手动操作将是非常耗时和繁琐的。幸运的是&#xff0c;我们可以使用一些软件来批量添加水印。在此&#xff0c;…

Kubernetes中如何使用 CNI?

一、CNI 是什么 它的全称是 Container Network Interface&#xff0c;即容器网络的 API 接口。 它是 K8S 中标准的一个调用网络实现的接口。Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式。实现了这个接口的就是 CNI 插件&#xff0c;它实现了一…

MySQL查看数据库、表容量大小

1. 查看所有数据库容量大小 selecttable_schema as 数据库,sum(table_rows) as 记录数,sum(truncate(data_length/1024/1024, 2)) as 数据容量(MB),sum(truncate(index_length/1024/1024, 2)) as 索引容量(MB)from information_schema.tablesgroup by table_schemaorder by su…

手写一个PrattParser基本运算解析器4: 简述iOS的编译过程

点击查看 基于Swift的PrattParser项目 iOS项目的编译过程与PrattParser解析器 前面三篇我们看到了PrattParser解析器的工作原理, 工作过程, 我们了解到PrattParser解析器实际上是模拟了编译过程中的 词法分析 、语法分析 、语义分析 、 中间代码生成 这几个编译前端过程. 那么P…

redis 从小白到大师系列

字符串 Redis 字符串数据类型 set 字符串 /*** 设置字符串*/ $t $redis->set(o1,o1); //返回true or false var_dump($t);get字符串 /*** 获取字符串*/ $t $redis->get(o1); //返回true or false var_dump($t);结果&#xff1a; string(2) “o1” 返回 key 中字符串…

现在游戏出海有多少优势?

国内游戏市场趋于饱和&#xff0c;但是国外市场潜力仍然可观&#xff0c;因此很多人选择游戏出海&#xff0c;那么现在游戏出海有多少优势呢&#xff1f; 1、市场潜力 全球游戏市场潜力巨大&#xff0c;增长迅速。中国游戏公司具有强大的研发能力和创新能力&#xff0c;能够开…

【Java集合类面试一】、 Java中有哪些容器(集合类)?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Java中有哪些容器&#…

xcode15一直显示正在连接iOS17真机问题解决

前言 更新xcode15之后&#xff0c;出现了各种报错问题&#xff0c;可谓是一路打怪啊&#xff0c;解决一个报错问题又来一个。没想到到了最后还能出现一个一直显示正在连接iOS17真机的问题 一直显示正在连接iOS17真机的问题 问题截图如下&#xff1a; 解决方法 1. 打开De…

“DDD创新”文章赏析-UMLChina建模知识竞赛第4赛季第16轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者…

MYSQL(索引+SQL优化)

索引: 索引是帮助MYSQL高效获取数据的排好序的数据结构 1)假设现在进行查询数据&#xff0c;select * from user where userID89 2)没有索引是一行一行从MYSQL进行查询的&#xff0c;还有就是数据的记录都是存储在MYSQL磁盘上面的&#xff0c;比如说插入数据的时候是向磁盘上面…

高效的 C++ JSON 解析、生成器 RapidJSON

简介 RapidJSON是一个高效的C JSON解析器和生成器。它专注于性能和易用性&#xff0c;使得处理JSON数据变得简单和快速。RapidJSON支持现代的JSON特性&#xff0c;如嵌套对象、数组、Unicode编码和注释。它的API简洁易用&#xff0c;可以轻松解析和生成JSON数据。无论你的项目需…