zoukankan      html  css  js  c++  java
  • Android组件化demo实现以及遇坑分享

    首先贴出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android组件化demo

    作者:TenzLiu
    原文链接:https://www.jianshu.com/p/416ca689ebc2

    前言

    前段时间看到最近一直很火的Android组件化然后就自己撸了一个demo,期间遇到了不少问题以及坑,在此记录一下,具体可以看项目源码。

    组件化无非就是将我们App项目下的几个模块在com.android.application与com.android.library之间切换。如下图:分为modulelib(类库模块,一些基本工具类),modulemain(入口模块),moduleone(模块1),moduletwo(模块2),而App只是担当一个空壳工程。


     
    1:新建一个Android项目,但是这个App只是一个空壳工程

     
    2:接下来就是创建这几个module了,先都是以Android Library就行,然后就是在每个module的build.gradle下面修改

     

    注意以为mudulelib只是作为一个根据库,所以不需要改,然后就是isModule从何而来,就是在整个项目的gradle.properties


     
    3:App项目App以及各个module之间的一来关系:

    首先modulelib是负责引用一些第三方类库以及一些基本代码的负责和一些工具类


     

    App:


     

    就是说当设置isModule=true的话各个模块处理modulelib都可以独立运行测试,也就是可以交给多人分开开发,最后只需要设置false就可以合并

    各个模块的module:


     

    在这里需要注意,modulelib的引用类库我们使用的是api,而不是implementation,因为implementation只能在本module有效,但是你去到如App那里就无效了;有一些类库引用是只有的比如butterknife:

    implementation'com.jakewharton:butterknife:8.8.1'

    annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'

    implementation我们需要在modulelib里面,但是annotationProcessor却需要在各个module里面都要写上。

    4:项目App怎么以modulemain为入口:

    这里注意我们的App下面的minifest是没有activity的

    image.png
    image.png

    而在modulemain的minifest下面有一个声明作为launcher的activity


     

    这个程序已启动就会运行modulemain下面的MainActivity了。

    5:各个module之间的交互怎么处理呢,比如一些activity的跳转,还有不同欧冠module之间获取fragment,这个上面也应该看到我是用的阿里的ARouter路由了,用法也很简单,官方链接:https://github.com/alibaba/ARouter

    如上面所说,在modulelib引用api'com.alibaba:arouter-api:1.3.1',然后在各个module下面annotationProcessor'com.alibaba:arouter-compiler:1.1.4'

    然后在各个模块的build.gradle下的defaultConfig下添加

    javaCompileOptions {
    
    annotationProcessorOptions {
    
    arguments = [moduleName :project.getName() ]
    
    }
    
    }
    

    这个官方文档有说明的。

    然后就是使用了,在module需要跳转的activity或是需要获取的fragment设置


     

    接下来就是跳转了,


     

    至于fragment也是一样,


     

    以及fragment的获取


     
    6:在module里面的资源id在switch,case无法使用:

     

    可以使用if,else代替


     
    7:butterknife的使用问题

    相信很多人都会用到butterknife注解,但是在module使用bb utterknife也会有坑,

    如上面所说,在modulelib引用api'com.jakewharton:butterknife:8.5.1',然后在各个module下面annotationProcessor'com.jakewharton:butterknife-compiler:8.5.1'

    在butterknife官方文档也有说明,如果是在module里面使用的话还要在各个module添加

    applyplugin:'com.jakewharton.butterknife'

    当然modulelib不需要,但是当你使用butterknife最新版8.8.1的时候就会因为这个报错,我也是在这里搞了很久马波的,原来是butterknife最新版不兼容的问题吧应该,只需要调低版本就好了,我这里是用了8.5.1

    module使用butterknife还有一个R资源的问题,就是你butterknife注解使用的资源不能用R,而是要用butterknife提供的R2来寻找资源


     
    8:之前说了每个module在设置isModule=true之后就可以单独运行调试了,那这个的monifest也需要有两套吧,

     

    资源文件:


     

    再来看看内容对比


     

     

    剩下就撸码吧。

    完~

    作者:TenzLiu
    原文链接:https://www.jianshu.com/p/416ca689ebc2

    阅读更多

    2018年Android面试题含答案--适合中高级(下)

    屏幕适配全方位解析

    kotlin学习笔记-异常好玩的list集合总结

    我的Android重构之旅:插件化篇

    相信自己,没有做不到的,只有想不到的

    在这里获得的不仅仅是技术!

    image
  • 相关阅读:
    Mysql 数据库学习笔记03 存储过程
    Mysql 数据库学习笔记02 编程
    Mysql 数据库学习笔记01查询
    Struts2学习笔记04 之 拦截器
    Struts2学习笔记03 之 Result组件
    Group by与having理解
    Spring Assert断言工具类
    字符集、编码
    hibernate中Query的list和iterator区别(续)
    hibernate中Query的list和iterator区别
  • 原文地址:https://www.cnblogs.com/gooder2-android/p/9370429.html
Copyright © 2011-2022 走看看