Android组件化初探【含Demo】,阿里P8大佬亲自教你

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

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

  • 基础库、公共库:项目所需要的基础操作类,工具类 ,第三方库的引入封装 ,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 plugin: ‘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是没有被执行的,这个怎么解决呢,我们可以通过反射进行解决

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

image

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2017-2021字节跳动Android面试历年真题解析》

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

小程序,面试题解析,framework源码!

[外链图片转存中…(img-Dsscgbi5-1712438212672)]

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-geV9TgAx-1712438212672)]

《2017-2021字节跳动Android面试历年真题解析》

[外链图片转存中…(img-OI5y6mpD-1712438212672)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值