
最近遇到了學(xué)習(xí)的瓶頸期,有些動(dòng)力不足,于是花了些時(shí)間陪老婆看了部TVB老劇《創(chuàng)世紀(jì)》。劇中三兄弟的性格涇渭分明,沒想明白怎么能做了十幾年的兄弟,最后還做成了香港合伙人。這部老劇確實(shí)經(jīng)典,不管是商場上的爾虞我詐,股市上的翻云覆雨,合伙人之間的矛盾與合作,朋友與敵人的不斷轉(zhuǎn)換都很有看頭。在所有的變化之中,唯有一條兄弟情貫穿始終,卻悲劇收?qǐng)?,不勝唏噓。
(一)初識(shí)Android應(yīng)用
(1)Android移動(dòng)應(yīng)用與PC應(yīng)用的區(qū)別?

以上來自知乎的一份回答,這里我僅從技術(shù)實(shí)現(xiàn)的角度再稍微補(bǔ)充一下自己的理解。
PC應(yīng)用如果在這里縮小范圍,特指基于瀏覽器的Web應(yīng)用,那么從結(jié)構(gòu)上來說,Web應(yīng)用是B/S結(jié)構(gòu),Android應(yīng)用是C/S結(jié)構(gòu),兩者有本質(zhì)的區(qū)別。
前端:Web應(yīng)用是瘦客戶端,靠html、css、js,jsp分別控制靜態(tài)樣式和動(dòng)態(tài)顯示;Android應(yīng)用是富客戶端,靠xml和Java,其中前端的靜態(tài)樣式直接在xml中指定組件的布局和樣式,動(dòng)態(tài)顯示由Java直接控制。
業(yè)務(wù)邏輯:Web應(yīng)用的業(yè)務(wù)邏輯都依賴后端服務(wù)器,Android應(yīng)用的業(yè)務(wù)邏輯大部分可在前端完成(也可以放在后端,需要平衡)。
后端:這里主要指服務(wù)器端,由于通信方式都采用http協(xié)議,兩者的技術(shù)大體相同,除了業(yè)務(wù)邏輯的平衡之外,并無本質(zhì)區(qū)別。
另外,兩者技術(shù)上的區(qū)別更多來自操作系統(tǒng)的區(qū)別,android應(yīng)用運(yùn)行在Android操作系統(tǒng)上,PC應(yīng)用則運(yùn)行在Windows、IOS、Linus等眾多不同的系統(tǒng)上,他們的運(yùn)行邏輯不同。
(2)android與ios的市場份額?
眾所周知,在移動(dòng)市場上是android與ios雙雄相爭的局面,目前看來,在缺少應(yīng)用支持的情況下,windows等攪局者在移動(dòng)市場將越來越難以立足。
根據(jù)2017年五月份的一篇報(bào)道顯示,截止當(dāng)時(shí),android的市占率為86.1%,ios的市占率為13.7%,且重量的天平仍在向android傾斜。同時(shí),ios雖占比較小,但占據(jù)的是相對(duì)高端的市場,所以也不可小視。
(3)安卓移動(dòng)應(yīng)用的應(yīng)用場景?
從本質(zhì)上說,移動(dòng)應(yīng)用的興盛并非源自技術(shù)的推動(dòng),而是技術(shù)的發(fā)展解放了人們本就存在的對(duì)自由的渴求。(而地產(chǎn)則是滿足人們對(duì)穩(wěn)定的需求,人性就是如此復(fù)雜。)
從硬件層面,由于安卓的開源和平民化,安卓移動(dòng)應(yīng)用已擴(kuò)展到了幾乎所有門類的智能硬件,這個(gè)清單包括:手機(jī)、平板、電視、腕表、眼鏡、耳機(jī)、音箱、車載中控等等,隨著智慧城市、智能家居等概念地深入滲透,這個(gè)清單還會(huì)越來越長。
從應(yīng)用場景來說,有人提出軟件定義一切,我覺得安卓會(huì)滲透一切。
(二)Android開發(fā)知識(shí)點(diǎn)
下面主要以圖示的方式,梳理android開發(fā)的基本知識(shí)點(diǎn),高手勿噴。
(1)兩個(gè)常用IDE

Eclipse+ADT被人親切地稱為EA;
Android Sdudio被人牙癢癢地稱為AS。
從EA到AS的時(shí)候,我有種轉(zhuǎn)角遇到“愛”的感覺。這么熟悉的畫風(fēng),加上AS啟動(dòng)時(shí)那句“Powered By the IntelliJ Platform”,這不是剛才學(xué)Spring時(shí),折磨了我千百遍的IntelliJ IDEA嘛。應(yīng)了那句話,你現(xiàn)在受的苦,總會(huì)照亮你未來的路。
回到IDE,EA和AS的淵源來自于google的喜新厭舊,在android最初弱小的時(shí)候,背靠JAVA這顆大樹, 投入了Eclipse的懷抱。后來翅膀硬了,就嫌棄Eclipse人老珠黃,繼而轉(zhuǎn)投新秀IntelliJ Idea的懷抱。
AS最被人詬病的是卡成狗。由于使用了Gradle進(jìn)行項(xiàng)目管理,本來先進(jìn)的在線中央倉庫管理模式,由于google的被墻以及倉庫大部分在國外的緣故,于是時(shí)不時(shí)出現(xiàn)讀進(jìn)度條讀到你懷疑人生。不過,如果你使用過Android SDK Manager下載SDK,體會(huì)過想撞墻的感覺,那么AS的慢還是可以接受的。
然鵝,由于我學(xué)Android的主教程是《Android編程權(quán)威指南》,最后我還是從了AS。
(2)六個(gè)基本組件

在Android中有一些非常常用的組件,按照網(wǎng)上流傳的四大基本組件包括:Activity,Service,BroadcastReceiver,ContentProvider。這四大天王是按照地位(都必須注冊(cè)才能使用),而不是使用頻率來定義的,因此在這四大的基礎(chǔ)上,我又加上了兩個(gè)非常常用的組件:Fragment和View。姑且稱為左右護(hù)法,在視圖表現(xiàn)層具有無可替代的作用。
詳細(xì)的定義和使用方法需要參閱相關(guān)書籍和網(wǎng)絡(luò)文獻(xiàn)。
(3)四個(gè)郵差

安卓中有三個(gè)常用的被用來傳遞數(shù)據(jù)的組件,分別是:Intent,Bundle,Parcel。它們可分別用來傳遞從簡單基礎(chǔ)數(shù)據(jù)、數(shù)組、集合和復(fù)雜數(shù)據(jù)結(jié)構(gòu)的信息,可視情況選擇使用。其中,Intent雖然可以傳遞的數(shù)據(jù)不多,但是地位要遠(yuǎn)比其他三者高,因?yàn)樗怯脕韨鬟fActivity調(diào)用的。Intent的調(diào)用分兩種,顯示Intent調(diào)用主要是應(yīng)用內(nèi)調(diào)用,隱式Intent調(diào)用主要是應(yīng)用外調(diào)用。
除了以上三種數(shù)據(jù)傳遞組件,還有一種很基本的數(shù)據(jù)傳遞組件是使用單例模式,構(gòu)造全局靜態(tài)數(shù)據(jù)對(duì)象,供所有活動(dòng)調(diào)用。這種模式使用簡單,而且生命周期通常比Activity還久,但同樣缺點(diǎn)也很明顯,過度濫用會(huì)增加系統(tǒng)垃圾和負(fù)擔(dān)。
(4)七種常用布局

強(qiáng)調(diào)一點(diǎn),以上布局的屬性既可以通過xml靜態(tài)設(shè)置,也可以在Activity或Fragment中使用java進(jìn)行動(dòng)態(tài)設(shè)置。
其他如CoordinatorLayout,AppBarLayout,TabLayout,TextInputLayout先記下,回頭有時(shí)間再做探索。
(5)常用UI組件

以上是Android中常用的UI組件,與Layout搭配,完成頁面顯示;與監(jiān)聽器搭配,完成與用戶的交互。
(6)手機(jī)上常用的手勢交互

目前,用戶與智能設(shè)備之間交互分為可以粗略分為手勢、按鍵、傳感器動(dòng)作、語音等。用戶交互是一門很復(fù)雜的學(xué)問,目前有一個(gè)專門的職業(yè)就叫做交互設(shè)計(jì)師,目的就是以用戶體驗(yàn)為中心,研究怎么樣讓用戶獲得更新、更好、更快的體驗(yàn)。
我對(duì)常用的手勢動(dòng)作做了一些練習(xí),不考慮性能的話,目前已都能實(shí)現(xiàn)。后面還需要研究在這些基礎(chǔ)手勢的實(shí)現(xiàn)方法上,如何獲得更好的性能,如何設(shè)計(jì)出一些新的交互方案。
(7)手機(jī)上常用的軟硬件交互

除了與用戶的交互,還需要考慮app與android系統(tǒng)內(nèi)其他軟硬件之間的交互。
可以將系統(tǒng)內(nèi)的這些調(diào)用接口,看作是app本身功能的外延,那么作為設(shè)計(jì)師需要考慮的就是怎樣去調(diào)動(dòng)系統(tǒng)本身提供的豐富資源,去完成我們想要給用戶提供的功能體驗(yàn)。
上面列了一些常用的功能調(diào)用,需要注意的很多調(diào)用需要在androidmanifest中配置相應(yīng)的權(quán)限。其中部分常用的權(quán)限,如互聯(lián)網(wǎng)權(quán)限只需在應(yīng)用中配置好就可以;而一部分權(quán)限,如調(diào)用相機(jī)的權(quán)限在配置好后,使用前還需要獲得用戶許可。
(8)兩個(gè)半常見的數(shù)據(jù)持久化方法

目前為止,開發(fā)的App還只能停留于設(shè)備上本地應(yīng)用,對(duì)于應(yīng)用過程中產(chǎn)生的數(shù)據(jù)也只能保存在內(nèi)存中,應(yīng)用關(guān)掉或手機(jī)重啟后,數(shù)據(jù)將不復(fù)存在。
為了解決這個(gè)問題,還需要引入數(shù)據(jù)持久化方法。與Web應(yīng)用不同,這里介紹兩個(gè)半數(shù)據(jù)持久化方法。
首先是緩存,這里的緩存和CPU緩存與內(nèi)存池等概念不太一樣,而是App在手機(jī)里專門開辟的一個(gè)文件,用于存儲(chǔ)臨時(shí)數(shù)據(jù)的,主要用處是將網(wǎng)上下載的數(shù)據(jù)存在緩存區(qū),這樣下次再訪問同一頁面時(shí)就可以直接從緩存區(qū)讀取,達(dá)到節(jié)省流量的目的。這種數(shù)據(jù)雖不是永久存在的,但是在不認(rèn)為清除緩存的情況下,即使重啟手機(jī),緩存數(shù)據(jù)也不會(huì)消失。
其次是設(shè)備數(shù)據(jù)庫SQLiteDatabase,類似于電腦上的MySQL,不過這個(gè)數(shù)據(jù)庫是只服務(wù)于本機(jī)的。
最后是遠(yuǎn)程服務(wù)器存儲(chǔ)。與Web應(yīng)用相比,Android應(yīng)用是典型的富客戶端。
為了實(shí)現(xiàn)遠(yuǎn)程服務(wù)器請(qǐng)求與應(yīng)答,我首先在我的Spring服務(wù)器的控制層,新增了一個(gè)專門用于應(yīng)答Android請(qǐng)求的控制器,用于響應(yīng)比如登錄、注冊(cè)、下載圖片等。這里需強(qiáng)調(diào)的是,Spring不能給android返回jsp頁面,而是返回JSON數(shù)據(jù)。
然后在Android端試用了幾種網(wǎng)絡(luò)通信框架發(fā)送Get和Post請(qǐng)求,其中HttpUrlConnection實(shí)現(xiàn)起來總有一些問題,沒有成功。遂使用在目前開源框架界排名第一的Retrofit來實(shí)現(xiàn),不過由于一些細(xì)節(jié)問題,還是費(fèi)了九牛二虎之力才最終實(shí)現(xiàn)。
不過我還是要推薦使用Retrofit,因?yàn)檫@個(gè)使用的是當(dāng)下最流行的注解風(fēng)格,而且跟MyBatis畫風(fēng)很像有沒有。
(9)XX種常用開源框架

網(wǎng)上有一份流傳的 2017百大Android框架排行榜,試用了其中的幾種:Retrofit2,OkHttp3,RxJava,其他的以后慢慢再試。
(10)XX種常用架構(gòu)

其中,我們最熟悉的就是MVC架構(gòu),發(fā)現(xiàn)不光可以用在服務(wù)器端,還可以用在富客戶端。不過由于Activity和Fragment太多,這里沒法使用外觀模式,所以應(yīng)用功能豐富起來后,其內(nèi)部關(guān)系會(huì)比較亂。
MVP架構(gòu)則斬?cái)嗔薞iew層和Model層之間的聯(lián)系,所有的數(shù)據(jù)交互都通過Presenter這個(gè)中間層來實(shí)現(xiàn),因此各層之間的耦合性相對(duì)有所降低。
MVVM架構(gòu)在MVP的基礎(chǔ)上,實(shí)現(xiàn)了View層與ViewModel層的數(shù)據(jù)綁定,從代碼實(shí)現(xiàn)的角度有了較大簡化。
關(guān)于項(xiàng)目架構(gòu),這里有一篇文章有很精彩的分析,我就不羅嗦了。GUI 應(yīng)用程序架構(gòu)的十年變遷。
參考書目
《Android編程權(quán)威指南》