組件化開發 是適應團隊開發的一種模式?
如果你一個項目有三人以上聯合開發 你就會發現開發協作以及效率會大不如從前 代碼臃腫 各種調用 各種重復 都是有可能會發生的 甚至會出現今天寫明天錯 這時候單一的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 看一下 這個包的架構?
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 已上傳 需要源碼可以下載后查看