• 组件化之总结


    组件化:

    链接:http://note.youdao.com/noteshare?id=2eab8aa620df7b30b9747aedbfea3d9b&sub=D34FD81DFCFD40E1817F42EFC7817E47

    Demo地址:https://github.com/Quyunshuo/ComponentDemo
     

    组件化的简介
    将apk拆分为多个模块(组件)进行开发,开发阶段组件可单独测试,通用组件可进行依赖复用,开发完毕阶段,将所有模块(组件)进行合并为真正的apk
    组件化的好处
    • 业务组件可以单独分配并行开发
    • 单个组件业务可以由开发者自行决定采取MVC/MVP/MVVM架构而不影响整体大局
    • 新同学接手项目分配任务可单独分配某一个模块任务,不必关心整个项目
    • 开发效率提升,开发过程仅仅需要维护开发自己的组件内容
    • 若公司有多个团队,优秀代码组件可快速移植复用
    • 积累个人的组件仓库,摆脱粘贴复制的“搬砖工”身份
    • 测试可单独测试某个模块
    组件化构建流程
    • 组件以及第三方SDK的版本控制
    组件化开发中存在多个组件与模块,必须考虑每个模块的统一性,所以需要对每一个module进行support包和第三方SDK配置的统一管理。统一配置以后供其它组件模块使用。
    1.组件化架构需要一个版本控制文件来控制整个项目的各种版本,需要在项目下新建config.gradle文件并添加需要控制的版本信息
    2.在各组件的build.gradle文件中进行修改版本信息,将项目版本控制的内容加入
    3.为了让整个项目都能正常使用版本控制文件,在项目的build.gradle文件中添加对版本控制文件的支持
    • 动态切换Application和Library模式
    在组件化中是由各组件和一个主的App构成,组件就是一个Library,它是最下层的东西供App使用,它既可以作为一个Library,又可以作为一个App,这就需要动态的去切换这两种模式
    1.在config.gradle文件中添加一个属性用来控制各组件的模式
    2.新建的组件进行更改build.gradle文件,进行版本控制。isApplication为true时是Application,反之则为Library。
     
    3.怎么使用config.gradle文件中的属性进行控制各组件的模式呢?
    在各组件的build.gradle文件添加if判断即可
    在Application模式下是需要一个applicationId的,因此再添加一个判断,注意他的id是不能够重复的,现在他就是App,只不过现在他还没有Activity
    当isApplication为false的时候它就是Library模式
    • Library组件与主App的AndroidManifest清单合并
    在每一个组件中都会有AndroidManifest清单文件,它们也是需要进行分模式处理的,不同的模式下需要不同的AndroidManifest。
    1.在组件中新建debug和release文件夹,把清单放入两个文件夹中,其中debug 文件夹内的清单代表Application模式下需要的清单内容,release文件夹的清单代表Library模式下需要的清单内容。
    当组件是Application模式的时候需要的清单格式如下,把相关资源复制到该组件中
    当组件是Library模式的时候需要的清单格式如下
    在组件build.gradle文件中添加if判断来控制不同模式下对清单的调用
    当组件是Library模式的时候还需要移除Application模式下debug中无用的包
    下面来测试一下,把组件的模式调为Application模式,并在组件中新建一个Activity,在debug下的AndroidManifest清单文件中注册此Activity作为启动Activity
     
    在模拟器中运行这个组件,可以看到该组件是可以正常运行的
    • 组件与主app的application冲突与初始化
    我们做Android开发的时候通常会写一个全局的application来引用,那么在组件化架构下如何进行使用application呢?
    1.再新建一个组件ModuleB并把所有的配置都按ModuleA设置好,新建一个Activity-RegisterActivity作为主Activity
    2.现在整个项目有一个主app,两个Module
    当module作为单独的APP存在时(也就是Application模式)各个组件都要引用自己的application,可以在各组件的src/main/java/下新建一个包debug来存放自己的application类(为了测试只添加打印的功能即可)
     
     
    并在各组件自己的debug下的AndroidManifest清单文件下引用application
     
    运行两个Module,可以看到Log打印
     
    当各组件为Library模式为主app服务的时候,它们就需要整合application,具体操作如下:
    在主app中新建application类,添加两行Log,在主app的AndroidManifest清单文件中引用此application
     
    完成这一步之后还需要在主app的build.gradle文件中进行引用这两个Module
    运行主app此时可能会出现资源命名冲突和项目清单合并失败的问题,抛去这个问题,程序是可以正常执行的。
    项目清单合并失败解决方案:
    在app的项目清单中的<application>标签内添加tools属性
    解决了这些问题运行主app,可以看到正常打印两行Log
    如果后续还会报错R文件不属于任何资源,就重新构建项目
    • 组件与组件之间的资源命名冲突
    各组件之间会出现相同资源名的情况,在组件为Application模式的时候不会出现冲突,当作为主app的依赖时就会出现资源命名冲突的问题
    解决办法也较为简单:
    在各组件的build.gradle文件中添加一行代码,作用是为该module的资源名添加前缀用以区分个组件之间的资源命名
    然后手动更改各项资源名,例如:values下的资源id,activity,layout,把所有id更改为带前缀的,下次再新建此类资源的时候我们在build.gradle所规范的命名前缀就会自动补全
    • 组件与组件之间的跳转通信
    这里主要使用Intent进行跳转通信
    在app的activity布局文件中新建两个按钮用来跳转
    在MouduleA和ModuleB中也是创建两个按钮用来跳转测试
     
    由于三者是分离的,可以用具体的包名来做Intent跳转。当组件作为主app的依赖时,它们所使用的AndroidManifest清单文件是release文件夹下的,因此需要对此文件进行相应配置
     
    然后添加具体的逻辑代码(对跳转代码进行了封装)
    运行后可以正常跳转,ModuleA、ModuleB不再演示
    那么怎么进行通信呢?其实也很简单,以主app跳转到ModuleA为例:
     
    运行程序可以看到跳转后接收到了传的值
     
    组件单独运行时需要在主app的build.gradle文件中添加一个判断
    运行ModuleA的时候要把接收intent值部分try/catch掉,然后就可以正常运行
  • 相关阅读:
    SDUT OJ 2862 勾股定理
    交换排序(java)
    boost::asio的http client应用笔记
    Yii Framework2.0开发教程(1)配置环境及第一个应用HelloWorld
    排序
    python爬虫(一)抓取 色影无忌图片
    hdu3377之简单路径求最值
    hdu 4406 费用流
    1次查询优化的过程
    mysql中的group_concat函数的用法
  • 原文地址:https://www.cnblogs.com/awkflf11/p/9387846.html
Copyright © 2020-2023  润新知