栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android组件化初探【含Demo】,androidframework开发面试

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android组件化初探【含Demo】,androidframework开发面试

  • 应用层:宿主工程,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进行实现。同时中也会提供所有的

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

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

Service 的空实现,以避免引起的空指针异常

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

public interface ILoginService {

boolean isLogin();

String getAccountId();

}

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

public class ServiceFactory {

private ILoginService loginService;

private IGoodsService goodsService;

private ServiceFactory() {

}

public static ServiceFactory getInstance() {

return Inner.serviceFactory;

}

private static class Inner {

private static ServiceFactory serviceFactory = new ServiceFactory();

}

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

public void setLoginService(ILoginService loginService) {

this.loginService = loginService;

}

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是没有被执行的,这个怎么解决呢,我们可以通过反射进行解决

public class AssembleApplication extends baseApp {

@Override

public void onCreate() {

super.onCreate();

initModuleApp(this);

initModuleData(this);

initComponentList();

}

@Override

public void initModuleApp(Application application) {

}

@Override

public void initModuleData(Application application) {

}

//初始化组件

//通过反射初始化

private void initComponentList(){

for (String moduleApp : AppConfig.moduleApps) {

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644076.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号