Android 開發之組件化環境搭建

組件化開發 是適應團隊開發的一種模式?

如果你一個項目有三人以上聯合開發 你就會發現開發協作以及效率會大不如從前 代碼臃腫 各種調用 各種重復 都是有可能會發生的 甚至會出現今天寫明天錯 這時候單一的module 的開發模式 明顯已經不適合再繼續使用了 所以組件化 應運而生(當然還有插件化 以后會開篇插件化以及插件化相關的框架介紹 今天只談組件化 以及組件化和插件化的區別)

下面給他兩個示例圖 區別組件化 和 插件化


組件化圖例
插件化圖例

?例圖已經很明顯了 兩者從原理上來說是有著本質區別的 但最終目的都是為了提高開發效率和團隊協作能力

下面開始環境搭建 本文以as 為例

新建一個項目 KidsDemo?

新建一個module library libmodel 放公共方法 或者 資源?

新建一個phone module businessmodel 功能模塊

案例使用了中間件路由 Arouter 具體使用我就不說了 本文略長 關于第三方 我會提供相關聯系?

阿里巴巴中間件?點擊了解Arouter路由

我的項目架構?


項目架構

我們只寫兩個module 的 交互 和 通信 即 app 和 businessmodel 之間進行

首先對preject 進行配置?

打開project 的 build.gradle 文件?

添加中間件


apply plugin: ‘com.alibaba.arouter’ dependencies {?

….?

classpath “com.alibaba:arouter-register:1.0.0”?

// NOTE: Do not place your application dependencies here; they belong?

// in the individual module build.gradle files?

}


提取遠程依賴 設置開關 在project 的 gradle.properties 中添加?

isDebug = true;// false debug 模式 true 發布模式 ;false 開發模式不存在依賴關系


提取sdk管理供各model 調用 統一設置sdk版本

ext{?

android_compileSdkVersion = 25?

android_buildToolsVersion = ‘25.0.3’?

android_minSdkVersion = 16?

android_targetSdkVersion = 25?

app_versionCode = 1;?

app_versionName = “1.0”;

lib_fastjson = 'com.alibaba:fastjson:1.2.32'

lib_gson = 'com.google.code.gson:gson:2.6.1'

lib_xutils = 'org.xutils:xutils:3.5.0'

lib_router = 'com.alibaba:arouter-api:1.3.0'

lib_routercom = 'com.alibaba:arouter-compiler:1.1.4'

}


接著配置 libmodel 的 build.gradle 文件

compileSdkVersion rootProject.android_compileSdkVersion?

buildToolsVersion rootProject.android_buildToolsVersion

defaultConfig {

? ? minSdkVersion rootProject.android_minSdkVersion

? ? targetSdkVersion rootProject.android_targetSdkVersion

? ? versionCode rootProject.app_versionCode

? ? versionName rootProject.app_versionName

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

}

compile lib_gson?

compile lib_xutils?

這里配置了sdk 的一些屬性 和 gson xutils 等工具

配置 app 的 build.gradle 文件


compileSdkVersion rootProject.android_compileSdkVersion?

buildToolsVersion rootProject.android_buildToolsVersion?

defaultConfig {?

applicationId “com.example.mysmall.kidsdemo”?

minSdkVersion rootProject.android_minSdkVersion?

targetSdkVersion rootProject.android_targetSdkVersion?

versionCode rootProject.app_versionCode?

versionName rootProject.app_versionName?

javaCompileOptions {?

annotationProcessorOptions {?

arguments = [ moduleName : project.getName() ]?

}?

}?

testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”?

}?

buildTypes {?

release {?

minifyEnabled false?

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’?

}?

}?

resourcePrefix “app_” // 區別資源文件命名 防止重名問題

compile lib_router?

annotationProcessor lib_routercom?

testCompile ‘junit:junit:4.12’?

compile project(‘:businessmodel’)?

compile project(‘:libmodel’)

添加中間件 以及 添加 libmodel businessmodel 依賴

配置 businessmodel 的 build.gradle 文件?

if (isDebug.toBoolean()) {

applyplugin:'com.android.library'

}else {

applyplugin:'com.android.application'

}

android {?

compileSdkVersion rootProject.android_compileSdkVersion?

buildToolsVersion rootProject.android_buildToolsVersion

defaultConfig {

? ? minSdkVersion rootProject.android_minSdkVersion

? ? targetSdkVersion rootProject.android_targetSdkVersion

? ? versionCode rootProject.app_versionCode

? ? versionName rootProject.app_versionName

? ? javaCompileOptions {

? ? ? ? annotationProcessorOptions {

? ? ? ? ? ? arguments = [ moduleName : project.getName() ]

? ? ? ? }

? ? }

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

}

buildTypes {

? ? release {

? ? ? ? minifyEnabled false

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

? ? }

}

resourcePrefix "business_" // 同上 區別命名

}

compile lib_router?

annotationProcessor lib_routercom?

compile project(‘:libmodel’)?

添加中間件 和 libmodel 依賴

然后我們要配置清單文件 manifast.xml?

main/ 包下創建 debug/包 然后復制你的manifast.xml 到 debug 下 修改 application 和 mainactivity 的屬性即可

然后在android 閉包下配置?

sourceSets {

main {

if (isDebug.toBoolean()) {

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

? ? ? ? }else {

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

? ? ? ? }

}

}

好了 這樣就可以了 分別提供在library 和 application 情況下對manifast的訪問


到這里基本配置 已經完成了?

解釋一下 幾個點

第一 app 和 businessmodel 僅僅只配置了?

compile lib_router?

annotationProcessor lib_routercom // 阿里巴巴的中間件?

compile project(‘:libmodel’) // 共有基礎包?

這里并沒有配置 網絡請求 和 解析 工具 是因為我在libmodel 中已經配置 app 和 buisnessmodel 中配置了 libmodel 直接調用即可 初始化 和 相關封裝 工作 都在 libmodel 中 并提供接口 共app 和 buisinessmodel 調用

第二 businessmodel 的相關配置?

if (isDebug.toBoolean()) {

applyplugin:'com.android.library'

}else {

applyplugin:'com.android.application'

}

不知道大家注意沒有 在project 的 gradle.properties 文件下 的 我給了一個屬性 isDebug = true;// false debug 模式 true 發布模式 這是個開關 為了加載不同的busnessmodel 類型 當為true 是 businessmodel 是個library module 反之 是app module

當然 還有的人將manifastxml 文件進行了配置 配置了兩個 這個也是可以的 而我這里沒有配置 是因為我一直是當作module 開發的 這種方式的配置方式是 在businessmodel 的main包下 創建一個debug包 將mainfastxml 文件復制一下 paste到 debug 包下 并去掉MainActivity的相關屬性即可

我們開始編寫libmodle 看一下 這個包的架構?


libmodel結構

base 基礎包 存儲baseactivity application 和 activity管理者?

router 路由包 管理路由 初始化 和 uri 地址管理?

utils 工具包 一些sp工具 gson 解析工具等



首先看一下 base 包?

AppContext 是上下問管理類 獲取application 的 上下文對象 具體代碼就不寫了 稍后我會push 到 github 上?

AppManager app的堆棧管理 所有的activity?

BaseActivity activity 的父類 和 activity 生命周期管理?

BaseChildApplication 各個modile 的application 的 父類 管理同意初始化 以及內存管理?

ApplicationAsLibrary 內存管理的抽象方法

router 包下 ConstantRouterUri 所有的uri 的 常量類?

utils 這個包就不說了 無關緊要 只是展示作用而已?

稍后會有代碼上傳 如有需要 自己去pull 就i好了

現在我們開始編碼 我想要app 和 businessmodule 進行互相跳轉 互相傳值并展示?

app module 下只有兩個類 一個是mainactivity 一個是appApplication

/**

* 作者: Nade_S on 2018/6/21.

*/public classMyAppextendsApplication{? ??

@Override? ??

public void onCreate() {

? ? ? ? super.onCreate();

? ? ? ? ARouter.openLog();? ? // 打印日志? ? ? ??

ARouter.openDebug();? // 開啟調試模式(如果在InstantRun模式下運行,必須開啟調試模式!線上版本需要關閉,否則有安全風險)? ? ? ?

?ARouter.init( this ); // 盡可能早,推薦在Application中初始化? ? }

}


App的MainActivity

//@Route(path = "/app/activity/main")

@Route(path = ConstantRouterUri.AppMainUri)

public class MainActivityextends AppCompatActivity {

@Override

? ? protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? findViewById(R.id.app_jump_bt).setOnClickListener(new View.OnClickListener() {

@Override

? ? ? ? ? ? public void onClick(View v) {

ARouter.getInstance().build("/business/activity/main").withInt("age",33).withString("name","c羅").navigation();

? ? ? ? ? ? }

});

? ? ? ? int age = getIntent().getIntExtra("age",0);

? ? ? ? String name = getIntent().getStringExtra("name");

? ? ? ? Toast.makeText(this, "appMain---"+name+age, Toast.LENGTH_SHORT).show();

? ? }

}


為了直觀顯示 我把MainActivity 直接寫在了這里

@Route(path = ConstantRouterUri.AppMainUri) 這樣也是可以的

我現在要做的操作的是 點擊跳轉到 businessmodel 下 MainActivity 頁面 并傳值過去

現在開始編寫 businessmodel包下的MainActivity

//@Route(path = "/business/activity/main")

@Route(path = ConstantRouterUri.BusinessMainUri)

public class MainActivity extends AppCompatActivity {

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.b_activity_main);

? ? ? ? findViewById(R.id.business_jump_bt).setOnClickListener(new View.OnClickListener() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void onClick(View v) {

? ? ? ? ? ? ? ? ARouter.getInstance().build("/app/activity/main").withInt("age",34).withString("name","梅西").navigation();

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? int age = getIntent().getIntExtra("age",0);

? ? ? ? String name = getIntent().getStringExtra("name");

? ? ? ? Toast.makeText(this, "businessMain---"+name+age, Toast.LENGTH_SHORT).show();

? ? }

}


business取值并展示 點擊返回到app包下的并傳值

效果如下:展示App/MainActivity 與 Business/MainActivty 相互傳值并顯示?


效果展示

當然這是發布版 如果是開發階段 直接在project的 build.gradle 設置開關debug--ture/false即可

好了 本文結束 如有疑問 留言或私信 demo 已上傳 需要源碼可以下載后查看

點擊下載demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容