ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android组件化初探【含Demo】,kotlin静态代码块

2021-12-25 13:32:10  阅读:162  来源: 互联网

标签:Demo ServiceFactory library application 模块 kotlin 组件 Android public


我们可以根据业务模块进行查分,把不同的业务模块放到不同的moudle中,实现各个业务之间的结构,他们又共同依赖底层公共库,这就是模块化的概念,但是当多个模块中涉及到相同功能时代码的耦合又会增加,例如有两个模块都需要视频播放的功能,把视频播放放到两个组件中就会出现代码重复的问题,放到公共库感觉也不是很好,这时候就用组件化来解决这个问题

模块化和组件化

==========================================================================

模块化


具体的业务模块,例如商品详情模块,商品发布模块 ,搜索模块

组件化


单一的功能组件,如视频播放组件、分享组件等,每个组件都可以以一个单独的 module 开发,并且可以单独抽出来作为 SDK 对外发布使用

模块化和组件化的思想是一样的,都是对代码进行拆分,但模块化是按功能模块进行查分(业务导向),组件化是按功能模块进行查分(功能导向),模块化的颗粒度更大一些,组件的颗粒度更小一些,一个项目中模块和组件同时存在也是很常见的,各自负责各自的事情

如上图所示 是个组件化项目的基本架构

  • 基础库、公共库:项目所需要的基础操作类,工具类 ,第三方库的引入封装 ,app宿主功能,各个模块,各个组件都依赖这个库

  • 组件层:项目用的功能模块或者业务模块,如:登录模块,视频播放组件,分享组件等

  • 应用层:宿主工程,APP的主项目,APP入口和主架子

组件化Demo

==========================================================================

demo地址:点击此处,找管理员拿我根据demo项目从以下几个方面来讲解

  • 1:项目分析

  • 2:组件application和library动态切换

  • 3:组件间的数据传递和方法调用

  • 4:组件类(例如:Fragment)的获取,以及夸组件页面跳转和通讯

1:项目分析


如上图所示,项目的主要结构

  • 应用层:app 项目的主入口

  • 组件层:goods login 商品详情页和登录组件

  • 基础库层:assemblebase用来各个组件数据和方法交互的 ,base是常用的工具类,各种类库的封装

2:组件application和library动态切换


在开发过程中,为了能够实现快速开发,组件能够独立运行就显的特别重要,moudle一般分为两种

  • App 插件,id: com.android.application

  • Library 插件,id: com.android.library

我们可以通过配置可动态进行application和library的切换,我们在各个组件的gradle.properties文件中配置一个控制切换的变量

然后在build.gradle中就可以通过isRunAlone变量来进行application和library的切换了,主要设计的点有三部分

  • plugin属性的配置

  • applicationId的配置

  • AndroidManifest的配置

if (isRunAlone.toBoolean()) {

apply plug

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

in: ‘com.android.application’

} else {

apply plugin: ‘com.android.library’

}

android {

compileSdkVersion 26

defaultConfig {

if (isRunAlone.toBoolean()) {

applicationId “ppzh.jd.com.goods”

}

minSdkVersion 15

targetSdkVersion 26

versionCode 1

versionName “1.0”

testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’

}

}

sourceSets {

main {

if (isRunAlone.toBoolean()) {

manifest.srcFile ‘src/main/manifest/AndroidManifest.xml’

} else {

manifest.srcFile ‘src/main/AndroidManifest.xml’

}

}

}

}

如果以上配置就可以实现application和library的切换了

3:组件间的数据传递和方法调用


由于主项目、组件之间,组件和组件之间不能直接通过引用进行数据传递和方法调用,那么在开发的过程中怎么进行数据传递和方法调用呢,可以通过「接口」+「实现」的方式进行,

assemblebase基础库就是用来进行数据传递和方法调用的,它被所有组件所依赖,assemblebase提供各个组件对外提供数据和方法调用的抽象service ,同时还有serviceFactory对service进行操作,各个组件在初始化的时候对各自的service进行实现。同时中也会提供所有的 Service 的空实现,以避免引起的空指针异常

就以登录模块为例,对外提供两个数据

public interface ILoginService {

/**

  • 是否已经登录

  • @return

*/

boolean isLogin();

/**

  • 获取登录用户的 AccountId

  • @return

*/

String getAccountId();

}

相关的serviceFactory类如下,可以通过serviceFactory拉取相关service的实例

public class ServiceFactory {

private ILoginService loginService;

private IGoodsService goodsService;

/**

  • 禁止外部创建 ServiceFactory 对象

*/

private ServiceFactory() {

}

/**

  • 通过静态内部类方式实现 ServiceFactory 的单例

*/

public static ServiceFactory getInstance() {

return Inner.serviceFactory;

}

private static class Inner {

private static ServiceFactory serviceFactory = new ServiceFactory();

}

// ------------------------LoginService------------------------

/**

  • 接收 Login 组件实现的 Service 实例

*/

public void setLoginService(ILoginService loginService) {

this.loginService = loginService;

}

/**

  • 返回 Login 组件的 Service 实例

*/

public ILoginService getLoginService() {

if (loginService == null) {

loginService = new EmptyLoginService();

}

return loginService;

}

在login组件中只需要实现ILoginService,并通过serviceFactory进行设置

public class LoginService implements ILoginService {

@Override

public boolean isLogin() {

return false;

}

@Override

public String getAccountId() {

return null;

}

}

在login的appliction中进行service的设置

public class LoginApp extends BaseApp {

@Override

public void onCreate() {

super.onCreate();

initModuleApp(this);

initModuleData(this);

}

@Override

public void initModuleApp(Application application) {

ServiceFactory.getInstance().setLoginService(new LoginService());

}

@Override

public void initModuleData(Application application) {

}

}

但是有这样一个问题:在集成到app中,LoginApp是没有被执行的,这个怎么解决呢,我们可以通过反射进行解决

标签:Demo,ServiceFactory,library,application,模块,kotlin,组件,Android,public
来源: https://blog.csdn.net/m0_65145685/article/details/122142321

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有