Kotlin就不說了..谷歌爸爸的親兒子...
MVP就不說了..解耦徹底..利于維護
模塊化就不說了..解耦更徹底..更利于維護
dagger就不說了..注入引用..
rx就不說了...跟著潮流走就行...
step1
新建一項目...開始入坑...
具體在Android studio中怎樣配置Kotlin...就不多說了..
Android studio 配置Kotlin
step2
上圖是模塊化的項目的大致結構圖...APP為主Application的運行程序...BaseLibrary為整個應用程序的基本組件...很多第三方依賴庫和一些相關配置都在此Module中...Provider為中間件連接庫..User為用戶的登錄模塊的庫...如此的話,就將一個整體項目(只包含登錄的部分)分為四個模塊...1,主App...2,基本模塊...3,中間模塊...4,用戶登錄模塊...此時需要注意的是主App為應用程序的啟動項..其余的三個是主App所依賴的library...
step3
好了...大致的三個模塊庫已經建立完畢...那么接下來就需要將三個模塊和主App進行關聯(lián)...
Provider模塊依賴BaseLibrary..其余的模塊依賴Provider模塊..這樣所有的模塊就都有了關系...當然主App還需要在依賴User模塊...
舉個例子:--> 一家四口..Base就是爸爸...去賺錢(依賴第三方庫和一些配置),Provider就是媽媽...負責給爸爸掌管財務(依賴于BaseLibrary)...User就是長子...爸爸出門在外...給媽媽要錢,依賴著媽媽...主App就是嬰兒...爸爸不在,既需要媽媽的照顧也許要哥哥的照顧...所以主App依賴于User和Provider..
1,主App的build.gradle文件中dependencies ---->說明: 如果有和BaseLibrary中的依賴有相同此處刪掉即可,避免重復依賴...
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
compile project(':Provider')
compile project(':User')
}
2,Provider中的build.gradle文件中dependencies ---->說明同上
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
compile project(':BaseLibrary')
}
3,User中的build.gradle文件中dependencies ---->說明同上
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
compile project(':Provider')
}
4,BaseLibrary中的build.gradle文件中的dependencies ---> 說明: 所有的依賴的第三方的庫和文件都在Base中...此處現(xiàn)在還沒有任何依賴
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
}
如此就依賴好了各個模塊之間的關系...相互聯(lián)系,相互依賴..想起來白夜行...亮子和雪穗.......
step3User模塊中新建LoginActivity
xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/MathMathV"
>
<EditText
android:id="@+id/mEtUserName"
style="@style/MathWrap"
android:layout_marginTop="20dp"
android:hint="輸入用戶名"
/>
<EditText
android:id="@+id/mEtPwd"
style="@style/MathWrap"
android:hint="輸入密碼"
/>
<Button
android:id="@+id/mBtnLogin"
style="@style/MathWrap"
android:layout_marginTop="20dp"
android:text="登錄"
/>
</LinearLayout>
activity代碼
class LoginActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
mEtUserName.hint = "請輸入用戶名"
mEtPwd.hint = "請輸入密碼"
mBtnLogin.setOnClickListener{
toast("點擊了注冊按鈕..")
}
}
}
上方activity代碼中直接用了xml中的控件Id..此處省去了butterknife的@bindView操作...用的也是Kotlin的插件..在User的build.gradle中添加一下依賴
apply plugin: 'kotlin-android-extensions'
之后sync同步即可,就可以直接用控件的id對控件進行操作,不需要再findViewById和@bindView了...
相同的是Toast的彈出事件是依賴的kotlin中的anko依賴...anko提供了四個方面的操作(經典...數(shù)據(jù)庫...布局...協(xié)程),具體請移步至github.anko
step4
將User中的build.gradle文件中的apply plugin:'com.android.library'改為apply plugin:'com.android.application'之后進行編譯同步..就會出現(xiàn)此模塊的運行名稱,之后在manifest中添加啟動項和theme主題..點擊運行即可...一來試試結果二來試試有沒有bug運行成功...可以看到UserCenter的title..UserCenter和上文中的User是同一個Module...(請原諒我.......!!!!)
step5
搞了有那么一會兒了..運行一下吧...突然發(fā)現(xiàn)..握了個草..這怎么運行...
User是依賴庫...又不是主App...
那把User獨立成主App就好了...在User的manifest文件中添加啟動項intent-filter就好了么....
不好...還要將build.gradle中的apply plugin:'com.android.library'改為apply plugin:'com.android.application'才行
但是可能在寫的過程中,一會兒要作為主App運行,一會兒又要作為Module運行...這一會兒刪除啟動項,一會兒添加啟動項的...莫非騷年真的是意氣風發(fā),任勞任怨,勞動模范....別逗了,程序猿都是懶惰的..
在User的Module中..切換到project模式下...在main中創(chuàng)建兩個文件夾...一為debug, 一為release...之后將manifest文件拷貝兩份分別扔里面..debug時就是主App運行.release時就是模塊運行..
debug下的manifest文件代碼
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<activity android:name=".ui.activity.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
release下的manifest文件
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<activity android:name=".ui.activity.LoginActivity">
</activity>
</application>
至此...兩套清單文件是OK了,但是怎么樣分別在不同的情況下來使用呢...
在整體項目的gradle.properties文件中添加一句代碼,聲明一個變量
isUserModule = false
之后在User的build.gradle文件中進行兩次判斷..
if (isUserModule.toBoolean()) {
apply plugin: 'com.android.library' //如果isUserModule為true即為庫來運行
} else {
apply plugin: 'com.android.application' //否則為應用程序來運行
}
//與此同時...因為有兩套manifest文件..所以需要動態(tài)判斷使用..
sourceSets {
main {
if (isUserModule.toBoolean()) {
manifest.srcFile 'src/main/release/AndroidManifest.xml' //此處需要注意的是manifest是小寫,不是大寫....
//release模式下排除debug文件中的所有的Java文件
java {
exclude 'debug/**'
}
} else {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}
}
}
OK...進行編譯...同步...等待...
可以看到的是,當isUserModule為true時即代表User為一個依賴庫..運行的是主App的helloworld界面...
當isUSerModule為false的時候即代表User為一個應用程序運行...運行的是登錄的界面...
寫到這里,第一步的模塊化的初始化差不多已經完成...接下來寫登錄的MVP模式和Dagger2以及RX等相關...
未完待續(xù)...