android国籍组件,android组件化之路

问题:实际业务变化快,而工程内各个功能模块耦合度太高,不能对功能模块进行快速方便地拆分或组装。团队共同开发中,可能一个文件同时被多人修改,导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改,都需要进行功能测试和系统测试。

目的:解决以上问题,使项目可以灵活配置,功能模块完全解耦,实践组件化之路。

实现:在之前的开发中,一个应用程序,我们将全部功能模块都写在工程app包中。实践组件化,我们将各个功能模块独立出来,最终以依赖包的形式整合到app主Module中去。在这里我写了个项目demo,简单分了几个功能模块,应用结构如下图所示:

c2247bd5e554

项目组件化结构图

说明:每一个组件module是一个子工程,子工程可以依赖基础库baselibrary可独立运行;也可以作为主工程的依赖库。

具体实现:1:配置项目的buildscript,如下图所示:

c2247bd5e554

buildscript配置

关于butterknife的配置及用法:http://jakewharton.github.io/butterknife,butterknife8支持在lib库中注解。

2:在主app module gradle中如下配置:

applyplugin:'com.android.application'

applyplugin:'android-apt'

android {

compileSdkVersion COMPILE_SDK_VERSION as int

buildToolsVersion BUILD_TOOLS_VERSION

defaultConfig {

applicationId APPLICATION_ID

minSdkVersion MIN_SDK_VERSIONas int

targetSdkVersion TARGET_SDK_VERSIONas int

versionCode 1

versionName "1.0"

}

signingConfigs {

debugConfig {

storeFile file("***.jks")

storePassword "******"

keyAlias "*****"

keyPassword "******"

}

releaseConfig {

storeFile file("******.jks")

storePassword "********"

keyAlias "*****"

keyPassword"*******"

}

}

}

buildTypes {

release {

minifyEnabled false

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

}

}

dependencies {

if(!isDebug.toBoolean()) {//各个模块作为库加载

compile project(':loginmodule')

compile project(':startmodule')

compile project(':homemodule')

compile project(':msgmodule')

}else{//各模块独立运行

compile project(':baselibrary')

}

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

说明:关于activityrouter的配置及使用,在后面会说到。

3:baselibrary作为各个模块共同依赖的基础库,其gradle配置如下:

applyplugin:'com.android.library'

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

}

buildTypes {

release {

minifyEnabledfalse

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

}

}

}

dependencies {

compile fileTree(include: ['*.jar'],dir:'libs')

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile'com.android.support:appcompat-v7:24.2.1'

compile'com.jakewharton:butterknife:8.5.1'

apt'com.jakewharton:butterknife-compiler:8.5.1'

compile'com.github.mzule.activityrouter:activityrouter:1.2.2'

}

4:在子工程模块gradle配置如下(以homemodule为例):

if(isDebug.toBoolean()) {

applyplugin:'com.android.application'

}else{

applyplugin:'com.android.library'

}

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabledfalse

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

}

}

sourceSets {

main{

if(isDebug.toBoolean()) {

manifest.srcFile'src/debug/AndroidManifest.xml'

}else{

manifest.srcFile'src/release/AndroidManifest.xml'

}

}

}

resourcePrefix"home_"

}

dependencies {

compile fileTree(dir:'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile project(':baselibrary')

apt'com.jakewharton:butterknife-compiler:8.5.1'

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

说明:当module单独运行和作为module运行时,其activity在manifest中设置也会不同,这里可以根据isDebug设置不同的manifest。当分别开发模块时,容易出资源重复命名的问题,可以在build.gradle中设置resourcePrefix "home_",通过给模块设置不同的资源前缀,可以避免重复命名。

Activity跳转问题

从上面的配置中,可以看到,项目引入了apt'com.github.mzule.activityrouter:compiler:1.1.7',我们为什么使用ActivityRouter呢,当我们把各个功能模块抽成独立的lib的时候,各个模块之间难免要进行Activity的跳转及传参。我们不能再像以前那样直接通过startActivity来实现跳转了。关于ActivityRouter的配置及用法:https://github.com/mzule/ActivityRouter

使用在application中注解:@Modules({"app","homeModule","loginModule","startModule","msgModule"})

public class XxxxApplication extends Application {

}

每个module中创建空java类注解:

@Module("homeModule")

public class HomeModule{

}

组件间通信问题:

不同组件Activity之间传递大量数据时可以通过EventBus来进行传递,EventBus原理及用法:https://github.com/greenrobot/EventBus

编译运行

当在gradle.properties中设置isDebug=true时,可以独立运行每个module,独立运行调试,当设置isDebug=false,可以编译运行整个project,注意isDebug变量设置改变时,要重新对gradle进行sync。

可能遇到的一些问题:

1:如果遇到/com/github/mzule/activityrouter/router/RouterInit.java javaError:(7, 5) 错误: 找不到符号 符号:  变量 RouterMapping等错误,请检查app是否把各个Module都依赖进来了。

2:使用butterknife注解时,每个Module会对应生成R2文件,即使在base库里注解过了,Module也要重新注解,组件中不能直接使用。

3:如果项目中使用到menu注意:

@Override

protected void onMenuItemClick(MenuItem item) {

//        switch (item.getItemId()) {

//            case R2.id.xxx:

//                Routers.open(mContext,"");

//                break;

//        }

if (item.getItemId() == R.id.xxx){

Routers.open(mContext,"");

}

super.onMenuItemClick(item);

}

寻找对应的menu id时,用if else 代替 switch,注:itemid 和 R2值不一样,和R是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数...

lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它。 在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函…

android代码导入有错误,android新项目导入后进行编译出现cmake错误

问题描述使用as加载并且gradle sync 提示:SIMPLE:error configure同时使用make project提示问题出现的环境背景及自己尝试过哪些方法已经尝试更换过ndk 调整target brinary 然后完全clean project等操作相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码)使用g…

BZOJ1652 [Usaco2006 Feb]Treats for the Cows

蒟蒻许久没做题了,然后连动规方程都写不出了。 参照iwtwiioi大神,这样表示区间貌似更方便。 令f[i, j]表示i到j还没卖出去,则 f[i, j] max(f[i 1, j] v[i] * T, f[i, j - 1] v[j] * T) (←这样用推的方式更好想一点。。&#…

git+jekyll部署备忘

github,会自动帮忙编译jekyll编写的文件,只要将文件放到gh-pages分支 (或者使用官方教程的二级域名方式,项目名字,可以随便起,官网的例子是 用户名.github.com 作为项目名字,可以使用 用户名.github.com …

搜索 由浅入深 之一 水题

搜索很重要,是很难学的算法,能看懂很简单,但是要想真正做出题来就比较困难了,那么,我们现在就水题开始研究搜索。 水题之: 1024: [SCOI2009]生日快乐 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 830 …

android studio创建文件,如何在Android Studio中创建File Templates

标签: File Template Android Studio我发现一个可以让写程序变得简单的方法,那就是自定义文件模板(Custom File Templates).那么什么是File Templates呢?说白了,就是一个已经包含一部分代码的源文件如何创建File Templates首先&am…

odoo 中多币种处理(外币处理)

2019独角兽企业重金招聘Python工程师标准>>> 1. odoo多币种处理 http://www.cnblogs.com/godzone/archive/2012/11/05/2754436.html 2. OpenERP的价格表(Pricelist)机制: http://www.chinamaker.net/html/2011/study_1123/78.html 3. odoo …

h5 android数字键盘,【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)...

在Vue中的项目,基于VUX-UI开发,一个常见的需求:1、金额输入框2、弹出数字键盘3、仅支持输入两位小数,限制最大11位数,不允许0开头第一,首先想到额就是在VUX-UI中制定typenumber。--不可行VUX中的文档和代码…

Sybase数据库应用系统调优的五大领域

Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源:慧聪it网本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例,涉及了数据库应用系统调优的五大领域:压力测试、 应用端调优、服务器端…

android 6.0 ios9谁快,没安卓6.0流畅?iOS 9突飞猛进终于不卡

今天早些时候,iOS 9.1正式发布,改进系统Bug,添加新功能等,但还有不少反应系统流畅了。不知道是否是心里作用的关系,之前不少果粉吐槽iOS 9过于卡顿,苹果也是在一个版本一个版本的改进,这次的iOS…

(UML两个汇总)九种图。

最后总结UML关系,有明确的关系,现在让我们总结一下UML九图。。图往往比文字要直观,因此,当我们开发软件。文件必须是不可或缺的人物,。以下我将这九种图分了一下: 我们还能够将这九种图分为静态图和动态图&…

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式:下面的代码使用到了Co…

Android Ac 控件,Android控件--MultiAutoCompleteTextView

1.功能可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个选中的时候再次输入值时会自动匹配,可用在发短信、发邮件时选择联系人这种类型当中。2.独特属性android:completionThreshold"3" ----设置输入多少字符时自…

BZOJ1299 [LLH邀请赛]巧克力棒

怎么又是博弈论。。。我去 Orz hzwer,这道题其实是可以转化成Nim游戏的! "第一步: 先从n根巧克力棒中取出m(m>0)根,使得这m根巧克力棒的xor和为0,同时使得剩下的n-m根巧克力棒无论怎么取,xor和都不…

Fragment的保存

2019独角兽企业重金招聘Python工程师标准>>> 一、场景 在一个fragment播放语音文件,一旦设备发生旋转,播放将暂停。因为fragment将重新生成。具体的流程步骤如下: 二、解决的方式 在Fragment的onCreate方法中,设置s…

SQL Server 存储引擎-剖析Forwarded Records

我们都知道数据在存储引擎中是以页的形式组织的,但数据页在不同的组织形式中其中对应的数据行存储是不尽相同的,这里通过实例为大家介绍下堆表的中特有的一种情形Forwared Records及处理方式. 概念 堆表中,当对其中的记录进行更新时,如果当前数据页无法满足更新行的容量,此时这…

u3d游戏开发视频潭州_游戏美术行业的发展与应用人工智能学院专业介绍及未来前景系列报告会二...

为了让2020级新同学对动漫专业加深认识,更好的规划学习,学院于11月12日6点晚邀请了校企合作单位“369云遮月游戏公司”在长安校区图书馆阶梯教室进行了游戏美术行业的发展与应用的报告会,主题围绕“专业介绍与发展前景”展开,云遮…

华为谷歌互利合作曝光:或将推Nexus手表

业内传言称,中国的华为科技公司和韩国LG电子公司,今年将为谷歌公司设计两款Nexus品牌的智能手机,这也将是华为科技第一次参加谷歌的Nexus硬件计划。日前,国外权威媒体披露了华为Nexus硬件计划的更多内容。除了一款5.7英寸的智能手…

unity2d随机生成物体_2020 年最好用的一键生成设计神器,全在这里了!

对于很多新手设计师来说,要高效率地完成一件看上去还不错的设计作品,其实并不是一件容易的事。特别是在现实的工作中,对于临危受命的任务,更是很少有人会耐心地等你慢慢去摸索的.……不慌,今天就掏出一份私藏已久的设计…

android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭

进入车内,首先映入眼帘的就是双12.3吋全液晶仪表及中控联屏,出色的画面质感在第一时间吸引了我的注意。当然,全新的一体化智能座舱理念,多屏互联、多维交互也是它的最大亮点之一。全新一代别克GL8家族采用迭代更新的通讯解决方案&…