我理解的安卓组件化开发

Android组件化开发详解 学习目标: 熟练使用组件化开发,路由配置 学习内容: 在使用组件化开发前首先要明确项目整体框架,划分模块及业务(重点),好的开始才会有好的结果。模块划分明确后开始配置Module。 如图我们要完成以下功能: 1.点击商城进入ShoppingModule 2.点击登录进入LoginModule 3.点击账单红色区域展示账单列表(其他Module中的Fragment) (shareModule为公共模块) 根据业务需求创建如下: 在App的gradle.properties文件下添. 阅读详情

安卓组件化开发的意义

当项目比较大需要多人协同开发的时候,组件化开发可以使大家分模块开发,并且不会互相影响。并且可以单独调试,不受其他模块制约。

项目结构解析

创建一个主应用,两个子应用(既可以做应用,也可以作为主应用的依赖),一个base库实现主应用和子应用的通讯。创建后项目结构如下
在这里插入图片描述

统一项目编译版本

  • gradle.properties文件设置统一版本
	# 统一编译版本等信息,此处定义的都是String类型,如果需要String可以直接用,如果不是需要toInteger()等
	compile_Sdk_Version=28
	min_Sdk_Version=15
	target_Sdk_Version=28
  • 修改app、loginmodule、memodule、mudulelibrary的编译版本,以app为例
	apply plugin: 'com.android.application'
	
	android {
	    compileSdkVersion compile_Sdk_Version.toInteger()
	    defaultConfig {
	        applicationId "com.syw.modulesdemo"
	        minSdkVersion min_Sdk_Version.toInteger()
	        targetSdkVersion target_Sdk_Version.toInteger()
	        versionCode 1
	        versionName "1.0"
	        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
	    }
	    buildTypes {
	        release {
	            minifyEnabled false
	            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
	        }
	    }
	}

设置application和library切换开关

  • gradle.properties文件设置切换开关
	# application和library切换开关
	isLoginApplication=true
	isMeApplication=true
  • 主应用动态添加依赖
	//不要忘记toBoolean()
    if (!isLoginApplication.toBoolean()) {
        implementation project(':loginmodule')
    }
    if (!isMeApplication.toBoolean()) {
        implementation project(':memodule')
    }
    implementation project(':modulelibrary')
  • 子应用切换application和library、动态设置applicationId、动态设置AndroidManifest.xml、添加基础依赖。以login模块为例
	//1.动态设置application或library
	if (isLoginApplication.toBoolean()){
	    apply plugin: 'com.android.application'
	}else{
	    apply plugin: 'com.android.library'
	}
	
	android {
	    compileSdkVersion compile_Sdk_Version.toInteger()
	
	    defaultConfig {
	        //2.library不存在applicationId
	        if (isLoginApplication.toBoolean()){
	            applicationId "com.syw.loginmodule"
	        }
	        minSdkVersion min_Sdk_Version.toInteger()
	        targetSdkVersion target_Sdk_Version.toInteger()
	        versionCode 1
	        versionName "1.0"
	        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
	    }
	
	    buildTypes {
	        release {
	            minifyEnabled false
	            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
	        }
	    }
	
	//    3.library状态下AndroidManifest.xml没有application信息,不设置启动activity
	    sourceSets{
	        main{
	            if (isLoginApplication.toBoolean()){
	                manifest.srcFile 'src/main/AndroidManifest.xml'
	            }else{
	                manifest.srcFile 'src/main/manifests/AndroidManifest.xml'
	            }
	        }
	    }
	}
	
	dependencies {
	    implementation fileTree(include: ['*.jar'], dir: 'libs')
	    implementation 'com.android.support:appcompat-v7:28.0.0'
	    implementation 'com.android.support.constraint:constraint-layout:2.0.2'
	    testImplementation 'junit:junit:4.12'
	    androidTestImplementation 'com.android.support.test:runner:1.0.2'
	    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
	    implementation project(':modulelibrary')
	}

依赖库的manifest.xml

	<?xml version="1.0" encoding="utf-8"?>
	<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	    package="com.syw.loginmodule">
	
	    <application>
	        <activity android:name=".LoginActivity">
	        </activity>
	    </application>
	
	</manifest>

基础库设置

基础库设置接口,由子项目实现

以login模块为例,编写ILoginService

	public interface ILoginService {
	    void launch(Context context);
	
	    Fragment getFragment(FragmentManager fragmentManager, int containerId, Bundle bundle);
	}
编写接口管理类
public class ServiceFactory {
	// 单例模式
    private static final ServiceFactory instance=new ServiceFactory();
    public ServiceFactory(){}
    public static ServiceFactory getInstance() {
        return instance;
    }
	
    private ILoginService iLoginService;
    private IMeService iMeService;

    public ILoginService getLoginService() {
        return iLoginService;
    }

    public void setLoginService(ILoginService iLoginService) {
        this.iLoginService = iLoginService;
    }

    public IMeService getMeService() {
        return iMeService;
    }

    public void setMeService(IMeService iMeService) {
        this.iMeService = iMeService;
    }
}
子项目完成具体实现
public class LoginBridge implements ILoginService {
    @Override
    public void launch(Context context) {
        Intent intent = new Intent(context, LoginActivity.class);
        context.startActivity(intent);
    }

    @Override
    public Fragment getFragment(FragmentManager fragmentManager, int containerId, Bundle bundle) {
        LoginFragment loginFragment=new LoginFragment();
        loginFragment.setFragmentData(bundle);
        fragmentManager.beginTransaction().add(containerId,loginFragment).commit();
        return loginFragment;
    }
}
跳转方法的调用

跳转的具体实现已经完成,现在的问题是怎么调用,我们想要实现的是在MainActivity中通过如下代码调用

	ServiceFactory.getInstance().getLoginService().launch(MainActivity.this);

那么现在的问题是,什么时候将LoginService设置到ServiceFactory,刚开始的时候还在想,既然已经依赖了loginmodule,为啥不直接跳转。仔细想想,这就违背了组件化的本意了,我们应该减少子项目和主项目之间的耦合,通过中间库的方式。
为了调用getLoginService,我们首先需要setLoginService,将实现类设置到ServiceFactory。于是就有了下面的方法

在子项目中创建一个方法,在主项目初始化的时候,通过主项目调用,子项目将实现类设置给ServiceManager
  • 我们首先需要在基础库创建一个接口,通过主项目调用,实现全部子应用设置Service
	public interface Appcompat {
	    void initializa();
	}
  • 我们首先创建一个类,实现该接口,设置LoginService
	public class LoginApplication extends Application implements Appcompat {
	    @Override
	    public void initializa() {
	        ServiceManager.getInstance().setLoginService(new LoginBridge());
	    }
	}
  • 我们创建一个类,管理所有子项目设置Service的类。主项目通过反射的方法调用,实现全部子应用设置Service
	public class AppConfig {
	    public static final String[] COMPONENT={
	      "com.syw.loginmodule.LoginApplication",
	      "com.syw.memodule.MeApplication"
	    };
	}
  • 现在我们需要在主项目中调用方法了,首先在主项目初始化的时候,通过initializa方法调用,已经让所有子项目setXxxService。
	public class MainApplication extends Application {
	    @Override
	    public void onCreate() {
	        super.onCreate();
	        for (String component : AppConfig.COMPONENT) {
	            try {
	                Class<?> clazz=Class.forName(component);
	                Object obj = clazz.newInstance();
	                if (obj instanceof Appcompat){
	                    ((Appcompat) obj).initializa();
	                }
	            } catch (Exception e) {
	                e.printStackTrace();
	            }
	        }
	    }
	}
  • 在需要使用的地方,即可直接getXxxService,然后调用方法
	public class MainActivity extends AppCompatActivity {
	
	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.activity_main);
	
	        findViewById(R.id.gologin).setOnClickListener(new View.OnClickListener() {
	            @Override
	            public void onClick(View v) {
	                ServiceManager.getInstance().getLoginService().launch(MainActivity.this);
	            }
	        });
	
	        findViewById(R.id.gome).setOnClickListener(new View.OnClickListener() {
	            @Override
	            public void onClick(View v) {
	                ServiceManager.getInstance().getMeService().launch(MainActivity.this);
	            }
	        });
	
	        findViewById(R.id.gofragment).setOnClickListener(new View.OnClickListener() {
	            @Override
	            public void onClick(View v) {
	                Bundle bundle=new Bundle();
	                bundle.putString("name","张三");
	                ServiceManager.getInstance().getLoginService().invokeLoginFragment(getSupportFragmentManager(),R.id.container,bundle);
	            }
	        });
	    }
	}

组件化开发虽然将每个模块解耦的干干净净,但是实际上彼此之间还是需要通讯。路由框架存在的意义就是:在他们之间没有任何关联的情况下,也能够替他们进行通讯
应该还可以参考阿里的aroute框架,aroute可以在目前先暂时记录到这里
demo下载链接https://download.youkuaiyun.com/download/ForMuHan/13067005

一文理解模块化、组件化、插件化的区别——Android开发进阶必备 从本篇开始,打算从广义上探究一下移动架构的思想;包括现在仍然比较火热的模块化,组件化, 插件化等架构思想。话说在前面,本篇旨在说明当前主流架构的设计概念,让大家了解当前的架构形式,以及主要用了什么设计思想,什么设计思路,算是引导篇… 一、模块化,组件化,插件化 上述概念已经好久了,或许还是有一些同胞对这些概念不是很清楚,大体知道是什么,但是详细也不知道是什么。现在来解析一下。 二、单工程模式 移动开发诞生,我们开发移动项目,我相信大多用的是单工程单任务的开发模式,二话不说,直接就开始写起,是不是这样呢? n 阅读详情

相关推荐

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 375

Android组件化开发,其实就这么简单

而关于本章的内容,在于总结,在于有实际的组件化实战代码,有开源的组件化Demo样例,重在浅显易懂,重在能够应用于实际业务,也重在简单,希望能够给大家带来一丝帮助。

知足常乐 4084

【Latex】【附安装文件】Miktex和TexStudio的安装与配置

这代表“构建并运行”,一般来说,我们只需要点这个按钮来运行Latex代码。保存一下代码文件,再运行一次,PDF文件会出现在与代码文件相同的文件夹下。安装完成后,你可能会跳转到一个页面中,你看到这个页面就意味着安装成功了。其实不需要你敲,你只要将下面的代码复制粘贴到你刚刚的文件中即可。成功安装MikTex后,我们需要进行更新,减少后续使用的麻烦。如果懂得将安装路径设置在你想要的盘中,你可以自己设置。双击上文的.exe文件后,你会看到如下画面。如果不懂,为避免不必要的麻烦,请直接点击“

未来就在脚下。 1万+

微信登录Fragment界面

最近有一点空余的时间,写了一个微信登录Fragment界面,目前只有界面,功能要慢慢往里加 1. 首先写一个MainActivity,在里面有登录按钮 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCrea...

mlsnatalie的博客 711

【第4章 光模块实测方法总结(环境搭建、眼图测试、接收测试、注意事项)】

本文系统介绍了光模块测试的完整流程与关键要点,涵盖低速模块到3.2T PAM4超高速模块的测试方法。内容包括:1)测试环境搭建(光路/电路要求);2)核心测试项目(眼图分析、接收灵敏度/饱和测试、误码压力测试);3)PAM4专项测试(TDECQ、RLM线性度等);4)可靠性测试(温循、电压、老化);5)八大注意事项(如禁止脏端面测试、长短距混插等)。特别强调高速模块对测试环境的高敏感性,需重点关注波形质量而非单纯光功率,并需进行严格压力测试才能暴露潜在问题。

学无止境 438

手把手教你用C#实现TwinCAT 3 ADS通讯(附完整代码示例)

本文详细解析了如何使用C#实现TwinCAT 3 ADS通讯,包括协议核心价值、开发环境配置、变量通信实践及高级应用场景。通过完整代码示例和性能优化技巧,帮助开发者高效实现工业自动化系统中的实时数据交换,特别适合倍福(Beckhoff)平台用户。

weixin_29230901的博客 117

Android组件化开发:手把手教你搭建组件化项目

Android组件化项目搭建流程,以及build.gradle配置抽离,实现统一配置管理。

qq_58451437的博客 4213

AI快速变现之路,AI视频创作

初期投入$3000(工具订阅+样片制作),重点攻克跨境电商和本地生活服务市场。关注2025年AIGC视频工具的API降价趋势(如Pika企业版折扣可达50%),建议与云服务商签订长期合作协议。

qq_29896351的博客 1981

Android 组件化○

1.组件化 组件化是指解耦复杂系统时,将多个功能模板拆分、重组的过程。在Android工程表现上就是把app按照其业务的不同,划分为不同的Module。 组件化架构的目的就是让每个业务模块变得相对独立,各个组件在组件模式下可以独立开发调试,集成模式下又可以集成到“app壳工程”中,从而得到一个具有完整功能的APP。 以美团外卖app为例: 组件化每一个组件都可以是一个APP,可以单独修改调试,而不影响总项目。 ①app壳:负责管理各个业务组件和打包APK,没有具体的业务功能; ②业务组件层:

zenmela2011的专栏 5505

ABAP Cloud define table 里的 not null 究竟在约束什么?——语义、场景与可运行示例

ABAP Cloud 中 not null 与 NULL 的用法解析 本文探讨了 ABAP Cloud 中 not null 关键字的语义与使用场景,对比了传统 ABAP 与 ABAP Cloud 在表字段定义上的差异: 核心概念 not null 是数据库层的列约束,强制字段不能存储 NULL 值 ABAP Cloud 通过 DDL 显式声明列是否允许 NULL,HANA 上 CDS 表默认创建为 NOT NULL 使用建议 主键、外键、审计字段等必须使用 not null 业务上可缺失的字段(如批准日期

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 299

(6)APB总线协议 —— 逻辑梳理(0.1认知)

这篇大家就差不多看看就行

CAUC_learner的博客 2702

对安卓组件化开发的理解

对于大部分Android开发的应用来说,冗余的代码,一个app module管所有,已经不太适用,譬如JAVA的maven分布式管理, 安卓组件化已经成为,安卓开发必不可少的一项技能。 优点:1.运行效率上面能提升很多,单个组件的单独编译,节省了开发时候编译时间和调试效率             2.便于版本管理,如果几个人同时开发一个APP,每个人负责不同的功能模块,如果还用一个app m...

Adversity reveals genius; fortune conceals it. 1072

GEE:计算非水体概率影像(水体淹没次数)

本文记录了在GEE平台上使用哨兵数据计算沿海地区非水体概率图像的计算方法和代码。基于像素,概率范围0-100。首先使用哨兵数据(s2)和大津算法(OTSU)计算的水体指数阈值来提取水体,然后计算研究区非水体像素在时间段内出现的概率。

养乐多的博客 2140

Android最全一文理解模块化、组件化、插件化的区别——Android开发进阶必备,2024年最新安卓hashmap面试题

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2301_79985012的博客 674

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android模块化和组件化开发简单理解(一)

模块化和组件化可以理解为同一个概念: 将一个app分成多个模块,每个模块都是一个组件(module),开发过程中让这些组件相互依赖或者单独调试某个组件。在发布的时候将这些组件合并成一个apk。 Android组件化我的理解是 application与library之间相互转换。 因为 在AndroidStudio开发中每个module中的build文件中第一句话都是:apply plugin...

wujainEW的博客 2228

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

一文理解模块化、组件化、插件化的区别,2024年最新android实战开发项目阅读器

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

2401_84141293的博客 1473

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android架构(五)组件化思想理解

组件化思想理解

古道西风 331

Android组件化和插件化

优快云  Android组件化方案 https://blog.youkuaiyun.com/guiying712/article/details/55213884   简书 谈谈我的理解-组件化/模块化 https://www.jianshu.com/p/79e4df63f31f 阿里ARouter开源组件化框架项目实践 https://www.jianshu.com/p/735c969fd...

JackWangDev的博客 1264

安卓交流软件!Android初级开发是如何一步步成为高级开发?大厂面试题汇总

导语 你想做安卓开发,怎么系统学习?你只需要看完这一篇就够了!!为什么只看这一篇就够了?现在优快云、知乎、掘金、GitHub上各路大佬层出不穷,他们深耕Android开发多年,总结出满满的学习干货。但同时也存在很多非良心的博主,要么活出了人类的本质,复读机一样到处转载; 要么纯粹自嗨型草草说了自己的工作经历,让读者无法从良莠不齐的资源海洋中高效高质地获取真正有用的信息。本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学? 本文的特点在于将繁琐的知

chayel123的博客 277

Android组件化开发之五:组件化开发实战Demo

组件化开发系列文章 Android组件化开发之一:为什么要进行组件化开发 Android组件化开发之二:组件化架构 Android组件化开发之三:组件化开发手册 Android组件化开发之四:组件化填坑之旅 Android组件化开发之五:组件化开发实战Demo 文章目录 1. 组件化项目结构图 2. 组件化项目模块 3. 注意事项 4. git地址 1. 组件化项目结构图 2. 组件化项...

dodod2012的专栏 740

安卓卡顿优化方法,来自阿里巴巴佛系安卓程序员的指南,通用流行框架大全

缘起 深圳市腾讯计算机系统有限公司成立于1998年11月,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一。 腾讯业务多元化,覆盖面广:社交、通信、娱乐全面开花。其中,腾讯QQ几乎是所有人的青春,各种气泡,装扮,是青春年少时的快乐。 我对腾讯的执念是从一款破解版QQ起。我当时机缘巧合从朋友那边得到了一款破解QQ软件,哪怕没有充会员,开VIP也可以使用各种主题和气泡,于是,当时尚且年幼的我对各种破解版软件产生了兴趣,并决定长大后要学破解软件。 架构师成长第一站—UML建模 1.正向工

160

Android组件化,全面掌握

组件化去除模块间的耦合,使得每个业务模块可以独立当做App存在,对于其他模块没有直接的依赖关系。此时业务模块就成为了业务组件。而除了业务组件,还有抽离出来的业务基础组件,是提供给业务组件使用,但不是独立的业务,例如分享组件、广告组件;还有基础组件,即单独的基础功能,与业务无关,例如 图片加载、网络请求等。这些后面会详细说明。组件化带来的好处加快编译速度:每个业务功能都是一个单独的工程,可独立编译运行,拆分后代码量较少,编译自然变快。提高协作效率:解耦 使得组件之间 彼此互不打扰,组件内部代码相关性极高。

Dream It Possible 804

总结一波安卓组件化开源方案

android平台上组件化开发的概念近两年非常火热,有些同学反映在面试中被问到的频率也很高。目前网上关于组件化开发方案的文章、开源库比较多,让很多初学者感到迷茫,不知该从何处入手,难以确定自身的业务特性适合使用哪种框架,如果全部都学习一遍成本比较高,而且在学习过程中容易将各方案的一些特性记混淆。

shenliba的博客 1138

安卓开发,如何将项目组件化

通过定义接口来实现组件间的通信,每个组件*

qq_43664361的博客 1082

Android组件化:我们到底该怎样学习和运用组件化?

前言 上个星期,我分享了一篇关于Android组件化的文章↓↓↓ Android组件化初探【含Demo】 后面看见评价区有朋友就“组件化”这个知识点发表了自己的看法。 我觉得这位朋友说的很有道理,今天在这里就想和大家好好探讨一下“组件化”这个知识点。 为什么要进行组件化开发? 这里推荐一篇文章:为什么要进行组件化开发? 这里给怕麻烦的朋友简单的说一下吧,单一工程开发模式有很多弊端,经常会遇到以下痛点: 对工程的任意修改调试都要编译整个工程,效率十分低下 不利于多人团队协同开发 无法做到功能复用 业务模块

weixin_49559515的博客 277

面试官:“你会组件化开发操作吗?它的优势在哪?”

随着 Android 版本的不断更新升级和用户对 APP 产品需求技术越来越高,相对的各大公司对 Android 开发者们设置的招聘门槛也越来越高。至于如何去看一个开发者水平的高低,一般看面试官会怎么问,会问哪些部分的技术内容?一般公司对于一些刚入行的新手要求不会太高,但基本要懂得的技术还要懂的,不会太深入的去问。而对于在 Android 开发行业有三五年经验的人,就不会这么简单的问了。会根据他们做过和设计到的一些项目进行询问。

1 1169
上一篇: 安卓线程池理解
下一篇: fori和foreach的区别
ForMuHan
博客等级 码龄10年 6粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值