前言
學(xué)習(xí)Kotlin有一段時間了,想寫一個項目總結(jié)收獲,就有了這個可能是東半球最簡潔的玩安卓客戶端,在此感謝玩Android 的開放API。
簡介
適合初學(xué)者入門的項目,通過對Kotlin的系統(tǒng)運用,實現(xiàn)的一個功能完備符合主流市場標(biāo)準(zhǔn)App。
雖然本項目的定位是入門級,但是該有的知識點卻一點不少,對理解其他項目設(shè)計思想和封裝技巧也很有幫助。
學(xué)習(xí)本項目你將有如下收獲:
- Kotlin實戰(zhàn)(函數(shù)進階,泛型,反射,協(xié)程...)
- MVVM開發(fā)架構(gòu)(ViewBinding,ViewModel,LiveData,RoomDatabase...)
- 單Activity多Fragment項目設(shè)計
- 暗夜模式
- 屏幕錄制
- 字節(jié)碼插樁
截圖展示
![]() 1.jpg
|
![]() 2.jpg
|
![]() 3.jpg
|
|---|---|---|
![]() 4.jpg
|
![]() 5.jpg
|
![]() 6.jpg
|
項目目錄結(jié)構(gòu)
├── app app
| └── src
| └── main
| | └── java 源碼目錄
| | ├── activity Activity目錄
| | | └── MainActivity 項目唯一Activity
| | ├── adapter Adapter目錄
| | ├── fragment Fragment目錄
| | ├── model ViewModel目錄
| | └── App Application
| |
| └── build.gradle 模塊構(gòu)建配置
| └── channel 渠道配置文件
| └── dictionary 自定義混淆字典
| └── proguard-rules.pro 代碼混淆配置文件
|
├── library_base 基礎(chǔ)library(存放通用的封裝源碼)
| └── src
| └── main
| | ├── assets 原生文件目錄
| | └── java 源碼目錄
| | ├── bus 消息總線目錄
| | ├── dialog Dialog目錄
| | ├── http 網(wǎng)絡(luò)請求目錄
| | ├── provider ContentProvider目錄
| | ├── utils 工具類目錄
| | └── view 自定義view目錄
| |
| └── build.gradle 模塊構(gòu)建配置
|
├── library_common 公共library(存放各個 module 公共的源碼及資源)
| └── src
| └── main
| | └── java 源碼目錄
| | ├── bean 實體類目錄
| | └── constant 常量配置目錄
| |
| └── build.gradle 模塊構(gòu)建配置
|
├── module_faq 問答模塊(目錄同app,不再展開)
├── module_home 首頁模塊(目錄同app,不再展開)
├── module_navigation 導(dǎo)航模塊(目錄同app,不再展開)
├── module_project 項目模塊(目錄同app,不再展開)
├── module_system 體系模塊(目錄同app,不再展開)
├── module_user 用戶模塊(目錄同app,不再展開)
|
├── plugin_statistic 統(tǒng)計插件模塊
| └── src
| └── main
| └── groovy 源碼目錄
| | ├── bp 埋點統(tǒng)計目錄
| | └── mt 耗時統(tǒng)計目錄
| |
| └── resources 配置目錄
| └── statistic.properties 插件配置
|
├── repos 統(tǒng)計插件生成目錄
|
├── build.gradle 項目構(gòu)建配置
├── config.gradle gradle編譯文件 gradle依賴配置
├── config.properties 項目配置
├── gradle.properties gradle配置
└── settings.gradle 項目依賴配置
ViewBinding
通過視圖綁定功能,您可以更輕松地編寫可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統(tǒng)會為該模塊中的每個 XML 布局文件生成一個綁定類。綁定類的實例包含對在相應(yīng)布局中具有 ID 的所有視圖的直接引用。
與使用 findViewById 相比,視圖綁定具有 Null 安全,類型安全等很顯著的優(yōu)點。
LiveData
LiveData 是一種可觀察的數(shù)據(jù)存儲器類,它具有生命周期感知能力,意指它遵循其他應(yīng)用組件(如 Activity、Fragment 或 Service)的生命周期。
LiveData 的優(yōu)勢:不會發(fā)生內(nèi)存泄漏,不會因 Activity 停止而導(dǎo)致崩潰,不再需要手動處理生命周期,數(shù)據(jù)始終保持最新狀態(tài),適當(dāng)?shù)呐渲酶?,共享資源。
ViewModel
ViewModel 類旨在以注重生命周期的方式存儲和管理界面相關(guān)的數(shù)據(jù)。ViewModel 類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)留存。
協(xié)程
協(xié)程是一種并發(fā)設(shè)計模式,您可以使用它來簡化異步執(zhí)行的代碼。
協(xié)程的特點包括:輕量,內(nèi)存泄漏更少,內(nèi)置取消支持,Jetpack 集成。
Fragment + LiveData + ViewModel + 協(xié)程
以項目中 MainFragment 為例:
class MainViewModel : ViewModel() {
val hotKeyResult = MutableLiveData<HotKeyListBean>()
// 獲取熱詞接口
fun getHotKey() {
// 通過viewModelScope創(chuàng)建一個協(xié)程
viewModelScope.launch {
// 構(gòu)建請求體,傳入請求參數(shù)
val request = HttpRequest("hotkey/json")
// 以get方式發(fā)起網(wǎng)絡(luò)請求
val response = get<HotKeyListBean>(request)
// 通過LiveData更新數(shù)據(jù)
hotKeyResult.postValue(response)
}
}
}
class MainFragment : Fragment() {
// 使用 'by viewModels()' Kotlin屬性委托獲取 MainViewModel
private val viewModel: MainViewModel by viewModels()
private val hotKeyAdapter = HotKeyAdapter()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 觀察 hotKeyResult 的變化來更新UI
viewModel.hotKeyResult.observe(viewLifecycleOwner, { result ->
result.data?.apply {
if (result.errorCode == "0") {
hotKeyAdapter.setNewData(this)
}
}
})
// 調(diào)用獲取熱詞接口
viewModel.getHotKey()
}
}
基于LiveData封裝的消息總線LiveDataBus
LiveDataBus具有生命周期感知,調(diào)用者不需要調(diào)用反注冊,并且沒有內(nèi)存泄漏風(fēng)險。
1、發(fā)送事件
LiveDataBus.with<String>("key").postEvent("value")
2、接收事件
LiveDataBus.with<String>("key").observe(viewLifecycleOwner, { it ->
println(it)
})
3、接收粘滯事件
LiveDataBus.with<String>("key").observeSticky(viewLifecycleOwner, { it ->
println(it)
})
基于RoomDatabase封裝的DBHelper
通過鍵值對的方式來存儲數(shù)據(jù),不用再去關(guān)心RoomDatabase的復(fù)雜操作。
1、存儲數(shù)據(jù)
DBHelper.set(“key”, "value")
2、獲取數(shù)據(jù)
DBHelper.get(“key”)
字節(jié)碼插樁
相關(guān)知識已發(fā)布在簡書上,可點擊下面鏈接跳轉(zhuǎn)查看
- 最通俗易懂的字節(jié)碼插樁實戰(zhàn)(Gradle + ASM)—— 優(yōu)雅的打印方法執(zhí)行時間
- 最通俗易懂的字節(jié)碼插樁實戰(zhàn)(Gradle + ASM)—— 自動埋點
主要開源框架
Thanks
感謝所有優(yōu)秀的開源項目 _
如果喜歡的話希望給個 Star 或 Fork _
謝謝~~





