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 函…

poj2750 PottedFlower(线段树的环状操作)

题目:Potted Flower 大意:该你一个换环,求环上的最大连续的和(如果最大和包含所有数,要求减去最小的一个)。 思路:这道题的思路并不难,需要在线段树里维护区间的最大和&#xff0c…

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

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

简单排序算法设计(Java)

总共有八种排序算法&#xff0c;还是慢慢看吧 1、简单排序算法 简单排序算法就是设置标兵&#xff0c;逐个比较数&#xff0c;然后查找插入位置&#xff0c;插入 public static void p(int[] a){for(int i0;i<a.length;i){System.out.print(a[i]" ");}}public sta…

cocos2d-x坐标系

在cocos2d-x在&#xff0c;有几种不同的坐标系。因为有好几个坐标系着一定的差异&#xff0c;他们需要明白&#xff0c;能力更精确的绘制各种图形画面上。 1.屏幕坐标系 只windows通过绘制图形上基本都知道。相应的坐标系统&#xff1a;原点在左上角。向右是x轴正方向&#xff…

android收入管理系统,毕业设计(论文)-基于Android系统的家庭理财通软件的设计——收入管理模块.docx...

PAGE河北农业大学信息学院本科毕业论文题 目&#xff1a;基于Android系统的家庭理财通软件的设计——收入管理模块学 院&#xff1a; 信息科学与技术学院专业班级&#xff1a; 计算机科学与技术0902班学 号&#xff1a;二O一三 年 五 月 二十八 日摘 要基于安卓系统的家庭理财通…

BZOJ1652 [Usaco2006 Feb]Treats for the Cows

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

android系统提供了url通信,Android两种HTTP通信,HttpURLConnection和HttpClient

Android系统中主要提供了两种方式来进行HTTP通信&#xff0c;HttpURLConnection和HttpClient&#xff0c;几乎在任何项目的代码中我们都能看到这两个类的身影&#xff0c;使用率非常高。不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的&#xff0c;如果不进行适当封…

ECSHOP 订单状态 记录

记录订单状态 order_status /* 订单状态 */ define(‘OS_UNCONFIRMED’, 0); // 未确认 define(‘OS_CONFIRMED’, 1); // 已确认 define(‘OS_CANCELED’, 2); // 已取消 define(‘OS_INVALID’, 3); // 无效 define(‘…

git+jekyll部署备忘

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

buidulbs android.jar,在将AS项目迁移到IDEA时,无法将com.android.bui...

我需要从Android Studio迁移到IntelliJ IDEA,因为我需要在Java中进行其他一些非Android的工作.我从git克隆了我的项目,并将其导入到IDEA中.但是,我在此过程中遇到了Gradle错误.我已经搜索过,但是找不到解决我的错误的答案.这是事件日志03:39:42 PM All files are up-to-date03:…

[华为机试练习题]60.水仙花数

题目 描述: 水仙花数又称阿姆斯特朗数。 水仙花数是指一个n 位数( n≥3 )&#xff0c;它的每个位上的数字的n 次幂之和等于它本身。&#xff08;例如&#xff1a;1^3 5^3 3^3 153&#xff09; 求输入的数字是否为水仙花数练习阶段: 初级 代码 /*-------------------------…

fscanf的返回值未成功输入的元素个数 .xml

test.txt 中保存的为&#xff1a;12345程序int i,j,k; FILE *fpfopen("e://test.txt","r"); if (fpNULL) { //return FALSE; } while (!feof(fp)) { jfscanf(fp,"%d%d",&i,&k); cout<<i<</t<<k<</t<…

Chrome英文版离线安装包下载

在原来在线安装地址后面加上 ?standalone1 即可 https://www.google.com/intl/en/chrome/browser/desktop/index.html?standalone1

搜索 由浅入深 之一 水题

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

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

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

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

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

android handler、looper、message、messageQueue、

一&#xff1a;handler&#xff0c;looper&#xff0c;message&#xff0c;messagequeue&#xff0c;thread handler: 消息处理着&#xff0c;负责Message消息的发送&#xff08;handler.sendMessage(....)&#xff09;以及处理消息&#xff0c;对于handler处理消息则需要实现h…

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

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

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

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