亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Kotlin 的記事本App 的開(kāi)發(fā)與實(shí)現(xiàn)

        2021-07-16 09:23:46李彥龍
        科學(xué)技術(shù)創(chuàng)新 2021年20期
        關(guān)鍵詞:記事本字段生命周期

        李彥龍

        (美的智慧生活(上海)科技有限公司,上海 201702)

        智能手機(jī)已經(jīng)成為人們工作生活的一個(gè)不可缺少的輔助設(shè)備,記錄備忘功能的應(yīng)用也成為了用戶日常使用率很高的一款應(yīng)用程序,觀察國(guó)內(nèi)手機(jī)廠商的系統(tǒng),都會(huì)預(yù)裝記錄備忘類應(yīng)用,比如華為手機(jī)“備忘錄”應(yīng)用,聯(lián)想手機(jī)的“聯(lián)想記事本”,小米手機(jī)的“便簽”應(yīng)用等。另外開(kāi)放市場(chǎng)上的NearyMe 云筆記,有道云筆記,大姨媽App,寶寶樹(shù)孕育APP 等記事本備忘類型的應(yīng)用都很受用戶的歡迎[1]。智能手機(jī)上的記事本相對(duì)于傳統(tǒng)的記錄方式可以做到記錄形式的多樣,更加的方便快捷。比如用戶可以通過(guò)錄音、視頻、圖片、文字等一種或者多種形式記錄。除此之外記錄的內(nèi)容還可以通過(guò)智能識(shí)別的方式,把包含時(shí)間點(diǎn)信息的記錄在日歷應(yīng)用中自動(dòng)生成提醒,更進(jìn)一步提高便捷性。本文介紹基于谷歌在2018 年Goole I/O 大會(huì)上發(fā)布的JetPack組件庫(kù)設(shè)計(jì)開(kāi)發(fā)聯(lián)想日歷的過(guò)程,為后續(xù)其它應(yīng)用開(kāi)發(fā)提供一套快捷高效的方案和思路。

        1 系統(tǒng)開(kāi)發(fā)相關(guān)技術(shù)

        記事本App 基于安卓平臺(tái)的應(yīng)用,使用Kotlin 這一Google官方推薦的語(yǔ)言開(kāi)發(fā)語(yǔ)言,并使用谷歌新推出的Jetpack 組件,實(shí)現(xiàn)高效快捷的開(kāi)發(fā)性能穩(wěn)定的應(yīng)用。下面介紹使用到的相關(guān)技術(shù)。

        1.1 Kotlin

        Kotlin 是一種新型的靜態(tài)類型編程語(yǔ)言,它有助于提高工作效率、開(kāi)發(fā)者滿意度和代碼安全性,截止2021 年2 月11 日谷歌商店排名前1000 的應(yīng)用中已經(jīng)有60%的采用了Kotlin 語(yǔ)言開(kāi)發(fā)[2]。2019 年Google I/O 更是把Kotlin 定位推薦語(yǔ)言,而且后續(xù)的支持組件包都是以Kotlin 為開(kāi)發(fā)語(yǔ)言??梢?jiàn)Google 對(duì)Kotlin 語(yǔ)言的重視。Kotlin 語(yǔ)言有以下特點(diǎn)[2]:

        兼容java,而且Android Studio 開(kāi)發(fā)工具有一鍵轉(zhuǎn)換功能,可以將java 語(yǔ)言轉(zhuǎn)換成Kotlin 語(yǔ)言。

        空指針安全。

        支持Lamada。

        支持?jǐn)U展。

        所以使用Kotlin 語(yǔ)言開(kāi)發(fā)Android 應(yīng)用可以做到:用更少的代碼更快速的開(kāi)發(fā)出更少空指針異常的應(yīng)用。

        1.2 JetPack

        Jetpack 是一個(gè)由多個(gè)庫(kù)組成的套件,可幫助開(kāi)發(fā)者遵循最佳做法,減少樣板代碼并編寫(xiě)可在各種Android 版本和設(shè)備中一致運(yùn)行的代碼,讓開(kāi)發(fā)者精力集中編寫(xiě)重要的代碼[3]。它是Google 公司在2018 年Google I/O 大會(huì)上推出的一套官方認(rèn)證的開(kāi)發(fā)系統(tǒng),包含架構(gòu)、UI、基礎(chǔ)庫(kù)、行為四個(gè)方面到目前一共有大約131 個(gè)庫(kù)[4],使用這些庫(kù)可以快速的搭建開(kāi)發(fā)一個(gè)穩(wěn)定的應(yīng)用,比如接下來(lái)介紹本文用到的幾個(gè)庫(kù)文件。

        1.2.1 ViewModel

        ViewModel 是JetPack 架構(gòu)組件中的一個(gè)類,它注重生命周期的方式存儲(chǔ)和管理界面相關(guān)的數(shù)據(jù)。相對(duì)于Activity 的7 個(gè)生命周期來(lái)說(shuō)ViewModel 只有兩個(gè)生命周期,它把自己的生命周期和初始化時(shí)候傳入的context 綁定,只有在綁定的context生命周期結(jié)束時(shí)才會(huì)銷毀。所以它只有兩個(gè)生命周期的回調(diào)函數(shù):創(chuàng)建和初始化傳入context 生命周期結(jié)束時(shí)候的onCleared回調(diào)方法。

        圖1 Activity 旋轉(zhuǎn)生命回調(diào)函數(shù)和綁定的ViewModel 生命周期回調(diào)函數(shù)的對(duì)比[5]

        基于上述ViewModel 的特點(diǎn)可見(jiàn),使用ViewModel 來(lái)作為容器管理UI 層依賴Model 層的數(shù)據(jù)是個(gè)便捷的做法,只需要初始化和使用,而不用管理界面的旋轉(zhuǎn)息屏等特殊場(chǎng)景數(shù)據(jù)的保存與恢復(fù)邏輯了,這樣可以把時(shí)間投入到業(yè)務(wù)邏輯的開(kāi)發(fā)中。

        1.2.2 LiveData

        LiveData 是一種可觀察的數(shù)據(jù)存儲(chǔ)器類。與常規(guī)的可觀察類不同,LiveData 具有生命周期感知能力,意指它遵循其他應(yīng)用組件(如Activity、Fragment 或Service)的生命周期。這種感知能力可確保LiveData 僅更新處于活躍生命周期狀態(tài)的應(yīng)用組件觀察者[6]。使用時(shí)注冊(cè)觀察者Observer,如果LiveData 的實(shí)例被通過(guò)setValue(T),postValue(T)接口賦值更新數(shù)據(jù)時(shí)候,會(huì)回調(diào)Observer 的onChanged()接口,一次觸發(fā)更新UI。

        1.2.3 Room

        Room 在SQLite 上提供了一個(gè)抽象層,以便在充分利用SQLite 的強(qiáng)大功能的同時(shí),能夠流暢地訪問(wèn)數(shù)據(jù)庫(kù)[7]。Room 是在SQLite 數(shù)據(jù)庫(kù)的基礎(chǔ)上又做了一層封裝,開(kāi)發(fā)者可以使用注解的方式方便的創(chuàng)建數(shù)據(jù)庫(kù)和定義訪問(wèn)數(shù)據(jù)庫(kù)的接口,且支持多線程。

        1.3 MVVM 架構(gòu)

        上文中我們提到了ViewModel,MVVM (Model-View-ViewModel)的架構(gòu)就是在之前MVP(Model-View-Presenter)基礎(chǔ)之上把Presenter 替換成ViewModel 形成的新的代碼架構(gòu)。ViewModel 作為顯示View 和數(shù)據(jù)存儲(chǔ)的Model 之間的橋梁,一方面可以作為數(shù)據(jù)的容器,另一方面可以作為業(yè)務(wù)邏輯的容器,從數(shù)據(jù)源獲取到的數(shù)據(jù)在顯示之前做一些處理。

        圖2 MVVM 架構(gòu)圖

        2 系統(tǒng)總體功能框架

        記事本應(yīng)用的主要功能有:

        2.1 主界面按照添加時(shí)間順序由上而下以列表形式顯示,每一個(gè)添加項(xiàng)都已卡片的形式展示。每一項(xiàng)有創(chuàng)建時(shí)間、標(biāo)題、文本內(nèi)容、圖片和語(yǔ)音圖標(biāo)。其中語(yǔ)音圖標(biāo)標(biāo)注時(shí)長(zhǎng),并有點(diǎn)擊播放按鈕。

        2.2 主界面下部偏右加號(hào)按鈕點(diǎn)擊進(jìn)入添加頁(yè)面、添加界面有創(chuàng)建時(shí)間、標(biāo)題輸入框、文本輸入框,下部的按鈕欄中有語(yǔ)音按鈕、圖片按鈕、拍照按鈕。

        2.3 主界面列表的每個(gè)卡片代表一個(gè)記事項(xiàng),點(diǎn)擊進(jìn)入編輯界面,此時(shí)編輯界面同添加界面,只是多了刪除和分享功能。

        2.4 在主界面上長(zhǎng)按一個(gè)記事項(xiàng)觸發(fā)進(jìn)入ActionMode 也就是多選編輯界面,多以點(diǎn)擊其它卡片選中,再次點(diǎn)擊取消,ActionBar 也就是頂部欄提示當(dāng)前已選擇項(xiàng)目的數(shù)目和刪除按鈕,這個(gè)功能便于用戶批量刪除。

        由于記事本的功能決定的,它把用戶創(chuàng)建界面生成記事項(xiàng)存入本地?cái)?shù)據(jù)庫(kù),然后在主界面再進(jìn)行讀取展示,點(diǎn)擊編輯再次對(duì)數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)進(jìn)行更新或者刪除。而主界面的多選模式則進(jìn)行對(duì)數(shù)據(jù)庫(kù)中的記錄進(jìn)行單個(gè)或者批量刪除。由此我們可以想到利用MVVM 架構(gòu)模式,如果把主界面展示的記事項(xiàng)作為一個(gè)數(shù)據(jù)item,那么我們可以把item 的列表作為一個(gè)LiveData 放入ViewModel 中,主界面的Activity 只需要觀察item的列表是否更新,觸發(fā)更新展示即可。而ViewModel 中可以在對(duì)記事項(xiàng)增刪改查操作后,觸發(fā)更新ViewModel 中item 列表項(xiàng)即可。至于LiveData 和Model 之間可以使用前面介紹的Room 組件替換SQLite 組件,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的創(chuàng)建和接口Dao 的創(chuàng)建。方便業(yè)務(wù)層ViewModel 對(duì)Model 層增刪改查的工作。下圖是經(jīng)典的基于Jetpack 架構(gòu)組件的架構(gòu)圖,本文設(shè)計(jì)開(kāi)發(fā)的記事本應(yīng)用由于功能決定的可以參考此經(jīng)典架構(gòu)。

        圖3 使用JetPack 架構(gòu)組件的典型架構(gòu)圖[8]

        3 系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)與構(gòu)建

        客戶端本地?cái)?shù)據(jù)庫(kù)的構(gòu)建也比較簡(jiǎn)單,一個(gè)table 名字為note_table。其中id 為自動(dòng)生成累加的索引,并設(shè)置為primary key。type 取值為枚舉類型的索引,取值范圍0-1,0 代表普通記事項(xiàng),只有文字內(nèi)容;1 代表有語(yǔ)音,圖片等內(nèi)容的記事項(xiàng);textx用于保存文字內(nèi)容的字段。image1-image4 存儲(chǔ)用戶選擇的圖片路徑或者拍照后生成的圖片文件的路徑。date 字段用于保存日期對(duì)應(yīng)毫秒。Voicepath 是保存語(yǔ)音文件路徑的字段。Ismedia,用于表示此項(xiàng)記錄是否有多媒體內(nèi)容,其實(shí)不用此字段通過(guò)判斷多個(gè)圖片字段和voicepath 字段也是可以判別的,用ismedia 字段只是多存儲(chǔ)一個(gè)便捷識(shí)別多媒體記錄項(xiàng)的標(biāo)志位。

        圖4 數(shù)據(jù)庫(kù)表結(jié)構(gòu)

        4 系統(tǒng)主要功能開(kāi)發(fā)與實(shí)現(xiàn)

        4.1 記事本App 客戶端的開(kāi)發(fā)與實(shí)現(xiàn)

        記事本App 的應(yīng)用的實(shí)現(xiàn)主要有三個(gè)部分,UI 部分、viewmodel 和model 部分,下面分別闡述這三部分的實(shí)現(xiàn)以及所用到的技術(shù)。

        4.1.1 UI/UI controller

        UI/UI controller 部分指顯示界面部分的代碼模塊。采用單Activity 多Fragment 的架構(gòu)設(shè)計(jì),這樣設(shè)計(jì)的好處是便于各個(gè)fragment 之間數(shù)據(jù)的傳遞與共享。MainActivity 作為其它兩個(gè)Framgnet 的容器,EditNoteFragment 顯示新建和編輯記事項(xiàng)的界面,NotListFragment 顯示所有記事項(xiàng)的列表。

        圖5 UI 部分代碼文件結(jié)構(gòu)圖

        4.1.2 viewmodel

        對(duì) 應(yīng) UI 部 分 兩 個(gè) fragment,viewmodel 部 分 有NoteItemViewModel 和NoteListViewModel 兩個(gè)文件,其中NoteItemViewModel 中包含有LiveDate<NoteItem>的實(shí)例;同時(shí)兩個(gè)ViewModel 實(shí)例也持有Model 層數(shù)據(jù)庫(kù)的實(shí)例。

        圖6 ViewModel 部分代碼文件結(jié)構(gòu)圖

        4.1.3 model

        model 部分是指本地存儲(chǔ)數(shù)據(jù)庫(kù),這部分包含數(shù)據(jù)庫(kù)的創(chuàng)建,管理以及Dao 接口封裝對(duì)數(shù)據(jù)庫(kù)增刪改查的實(shí)現(xiàn)。Dao 接口根據(jù)業(yè)務(wù)需要封裝了四個(gè)功能:(1)查詢所有數(shù)據(jù)庫(kù)中記事項(xiàng)的數(shù)據(jù)。(2)查詢單個(gè)記事項(xiàng)的數(shù)據(jù),查詢參數(shù)是id,這也是數(shù)據(jù)表中作為primary key 存儲(chǔ)的字段,保證唯一性。(3)更新接口,參數(shù)是NoteItem 實(shí)例。(4)刪除單個(gè)NoteItem 的接口,參數(shù)是id。

        這部分的實(shí)現(xiàn)由于使用了JetPack 中的Room 組件,所以我們只需要按照Room 組件的樣式創(chuàng)建數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)對(duì)應(yīng)的Bean 文件并使用固定的注解標(biāo)簽例如:@Entity (tableName =“note_table”)就可以創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)表。同樣的對(duì)Dao 文件也可以通過(guò)在Interface 接口定義的文件中使用@Dao 注解和@Insert 和@Query @Update 等標(biāo)簽就可以實(shí)現(xiàn)。舉例:查詢所有數(shù)據(jù)庫(kù)中保存的記事項(xiàng),可以這樣定義@Query (“SELECT *FROM note_table ORDER BY date DESC”);其中只需要注意note_table 為要查詢的表格的名字即可。

        4.2 智能生成提醒功能

        這里主要是通過(guò)用的正則表達(dá)式來(lái)匹配用戶創(chuàng)建記事項(xiàng)中的日期內(nèi)容,如果匹配成功則代表此記事項(xiàng)可以生成對(duì)應(yīng)的提醒,并提示用戶是否插入到日歷的提醒數(shù)據(jù)庫(kù)中,達(dá)到定時(shí)提醒的功能。比如:8 月15 日體檢這樣的內(nèi)容。則會(huì)提示用戶是否生成一個(gè)8 月15 日的提醒,提醒的內(nèi)容是體檢。如果用戶選擇同意則進(jìn)入日歷創(chuàng)建提醒的界面讓用戶繼續(xù)操作。當(dāng)然這里所說(shuō)的智能也只是窮舉日常中用戶輸入的日期格式,并不能做到全覆蓋,這里的正則表達(dá)式可以作為一個(gè)服務(wù)器接口后臺(tái)持續(xù)維護(hù),動(dòng)態(tài)分發(fā)給用戶使用。這樣可以做到用戶反饋匹配錯(cuò)誤或者不能智能識(shí)別日期的問(wèn)題可以快速的修正和發(fā)布,而用戶端則不需要更新應(yīng)用即可以看到修復(fù)后的效果,提升用戶體驗(yàn)。

        4.3 分享功能

        用戶有從記事本分享到朋友圈或者微信好友的需求,所以我們接入了微信的sdk 并結(jié)合系統(tǒng)的分享功能,通過(guò)在分享前重新排版組合生成圖片然后再調(diào)用分享接口的方式實(shí)現(xiàn)了一鍵分享的功能。

        5 結(jié)論

        記事本App 本身是一個(gè)功能相對(duì)簡(jiǎn)單的應(yīng)用,它的業(yè)務(wù)功能決定了界面修改內(nèi)容存儲(chǔ)到數(shù)據(jù)庫(kù),顯示時(shí)候又從數(shù)據(jù)庫(kù)中讀取這樣的特性,特別適合用JetPack 中的ViewModel 結(jié)合LiveDate 的架構(gòu)組件。所以本文借助記事本App 的設(shè)計(jì)實(shí)現(xiàn)介紹MVVM 的架構(gòu)和ViewModel,LiveDate 以及Room 架構(gòu)組件的使用。此經(jīng)驗(yàn)可用于開(kāi)發(fā)設(shè)計(jì)其它App,提升開(kāi)發(fā)效率和架構(gòu)的合理性,結(jié)合Kotlin 語(yǔ)言的使用也能進(jìn)一步提升開(kāi)發(fā)App 的穩(wěn)定性。

        猜你喜歡
        記事本字段生命周期
        動(dòng)物的生命周期
        全生命周期下呼吸機(jī)質(zhì)量控制
        圖書(shū)館中文圖書(shū)編目外包數(shù)據(jù)質(zhì)量控制分析
        做個(gè)樹(shù)懶記事本
        小狗記事本
        童話世界(2020年29期)2020-09-25 07:39:50
        從生命周期視角看并購(gòu)保險(xiǎn)
        民用飛機(jī)全生命周期KPI的研究與應(yīng)用
        動(dòng)物園
        土撥鼠的記事本
        CNMARC304字段和314字段責(zé)任附注方式解析
        青青草在线免费视频播放| 妺妺窝人体色www聚色窝韩国| 欧美亚洲日韩国产人成在线播放| 亚洲女人毛茸茸的视频| 强开小婷嫩苞又嫩又紧视频| 亚洲aⅴ天堂av天堂无码麻豆| 337p日本欧洲亚洲大胆色噜噜| 久久亚洲春色中文字幕久久久综合| 痴汉电车中文字幕在线| 亚洲国产午夜精品理论片在线播放| 五月天婷婷综合网| 天堂av在线播放观看| 亚洲人成综合第一网站| 日韩人妻无码精品-专区| 国产精品自产拍在线18禁| 亚洲女同性恋在线播放专区| 国产精品人成在线观看免费| 亚洲性啪啪无码av天堂| 亚洲黄色尤物视频| 亚洲精品国产av成人网| av无码国产精品色午夜| 天天综合亚洲色在线精品| 丰满熟妇人妻无码区| 人妻精品一区二区三区蜜桃| 97日日碰曰曰摸日日澡| 亚洲V日韩V精品v无码专区小说| 99熟妇人妻精品一区五一看片 | 国产精品无码专区综合网| 日本av第一区第二区| 风韵丰满熟妇啪啪区老熟熟女| 日本中文字幕精品久久| 色欲综合一区二区三区| 无遮挡亲胸捏胸免费视频| 亚洲国产av自拍精选| 日本中文字幕有码网站| 久久夜色精品国产欧美乱| 中文字幕av在线一二三区| 日韩狼人精品在线观看| 在线观看亚洲第一黄片| 久久久久久人妻毛片a片| 亚州AV成人无码久久精品|