??一起玩安卓,一個適合初學(xué)者入門的Kotlin項目

前言

學(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)查看

主要開源框架

Thanks

感謝所有優(yōu)秀的開源項目 _
如果喜歡的話希望給個 Star 或 Fork _
謝謝~~

項目地址

https://github.com/miaowmiaow/FragmentProject.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容