一切緣起于我在
CSDN 博客上寫技術(shù)文章。
還在讀本科的時(shí)候,我就喜歡閱讀
CSDN 出版的IT 技術(shù)雜志《程序員》。后來(lái)我進(jìn)入工業(yè)界開(kāi)始從事 Android開(kāi)發(fā)工作,在實(shí)際工作中遇到過(guò)很多技術(shù)難題,很多時(shí)候又都是從 CSDN 的技術(shù)博客上找到了答案。Android技術(shù)博大精深,體系龐大繁雜,一個(gè) Android技術(shù)難點(diǎn)往往需要花費(fèi)半天、一天甚至更長(zhǎng)時(shí)間才能研究清楚,然而事后一年半載,又遺忘得干干凈凈。好記性不如爛筆頭! 吸取了這些經(jīng)驗(yàn)和教訓(xùn),我開(kāi)始有意識(shí)地把自己對(duì) Android技術(shù)探索和發(fā)現(xiàn)的成果性內(nèi)容整理成文章,發(fā)表在 CSDN 博客上。當(dāng)時(shí)這么做主要出于三方面的考慮:
第一,知識(shí)點(diǎn)方便備查。在工作或?qū)W習(xí)中,如果遇到某一領(lǐng)域之前做過(guò)的內(nèi)容,只要想起其中一個(gè)或幾個(gè)關(guān)鍵詞,就能快速搜索、定位到之前圍繞這些技術(shù)寫的文章,朝花夕拾,進(jìn)而找回記憶。
第二,現(xiàn)在的
Android技術(shù)內(nèi)容交織,不斷向縱深發(fā)展,需要豐富的配圖和示例代碼加以說(shuō)明才能弄明白,在這種情況下若還用筆和紙記錄顯然很不方便。而在博客這種形式下,要想引用文章,則直接插入一個(gè)url網(wǎng)址鏈接就可以,配圖、插入程序代碼更不在話下。
第三,Android技術(shù)體系復(fù)雜,內(nèi)容越來(lái)越龐雜,有了之前寫好的博客文章,至少可以從中找到線索,找回當(dāng)時(shí)研究的思路和方法,快速搞清楚問(wèn)題的關(guān)鍵。這樣無(wú)疑大大提升了學(xué)習(xí)和工作效率。
我就這樣日復(fù)一日、年復(fù)一年堅(jiān)持寫博客文章,不知不覺(jué)中養(yǎng)成了寫博客的習(xí)慣,幾天不寫就感覺(jué)生活中缺了點(diǎn)什么。于是博客文章越寫越多,此時(shí)我發(fā)現(xiàn)自己博客的閱讀量不斷攀升,50萬(wàn)、100萬(wàn)、200萬(wàn)! 這個(gè)過(guò)程中讀者數(shù)量也不斷增多,可以說(shuō)一天一個(gè)樣,一天一個(gè)數(shù)據(jù)報(bào)表!如果說(shuō)開(kāi)始寫博客文章的初心是記錄自己的研究心得,沉淀自己的技術(shù)積累,然而當(dāng)我的博客文章閱讀量和讀者群體達(dá)到一定規(guī)模并越來(lái)越多的時(shí)候,寫博客文章就成為了一種樂(lè)趣。在這種樂(lè)趣的驅(qū)動(dòng)下,每當(dāng)攻克一個(gè)技術(shù)難題,腦海中第一反應(yīng)就是有必要整理一下,寫成簡(jiǎn)單易懂的博客文章分享給大家。
在博客寫作的過(guò)程中,我受到了大量的支持和鼓勵(lì),這又促使我寫出更多、更好的博客文章,以不辜負(fù)大家的期待。同時(shí),博客寫作豐富了自己的人生,也帶來(lái)了與之相關(guān)的機(jī)會(huì)。
本書內(nèi)容
本書所介紹的高級(jí)開(kāi)發(fā)技術(shù),是從軟件工業(yè)強(qiáng)度出發(fā),面向軟件生產(chǎn)環(huán)節(jié),甄選出 Android多種關(guān)鍵和高效的技術(shù),可直接快速投放到企業(yè)級(jí)、產(chǎn)品級(jí)項(xiàng)目的高級(jí)開(kāi)發(fā)技術(shù)中,覆蓋了完整開(kāi)發(fā)一個(gè) AndroidApp應(yīng)用涉及的各個(gè)層面、各個(gè)環(huán)節(jié)。
今非昔比,如今的
Android技術(shù)及其平臺(tái)和框架性技術(shù),都已經(jīng)發(fā)生了不小的變化。新的技術(shù)框架和編程模型均已有了很大的改變和演進(jìn)。我應(yīng)該算是中國(guó)比較早跟進(jìn) Android技術(shù)的開(kāi)發(fā)者之一,看到了 Android技術(shù)多年來(lái)的積累沉淀以及整個(gè)移動(dòng)端軟件開(kāi)發(fā)行業(yè)的發(fā)展,催生了相當(dāng)多 Android平臺(tái)之上的基礎(chǔ)和初級(jí)開(kāi)發(fā)者。
然而,當(dāng)開(kāi)發(fā)者面對(duì)實(shí)際的工業(yè)級(jí)項(xiàng)目產(chǎn)品開(kāi)發(fā)時(shí),需要解決的開(kāi)發(fā)任務(wù)所涉及的問(wèn)題是極為苛刻的設(shè)計(jì)要求、復(fù)雜的業(yè)務(wù)邏輯和數(shù)據(jù)流轉(zhuǎn)處理,若僅僅使用 Android基礎(chǔ)開(kāi)發(fā)技術(shù),所耗費(fèi)的時(shí)間和人力成本將會(huì)十分巨大。在這種情形下,無(wú)論是從技術(shù)管理決策層角度,還是站在一線的普通開(kāi)發(fā)者立場(chǎng),都非常有必要考慮選用快捷、高級(jí)的 Android研發(fā)技術(shù)路線和框架性解決方案。以上所述問(wèn)題,正是本書所要闡述的技術(shù)內(nèi)容。
本書讀者對(duì)象
讀者須具有一定的 Android和Java程序設(shè)計(jì)語(yǔ)言基礎(chǔ),但是對(duì)這些基礎(chǔ)前置知識(shí)不必做過(guò)多嚴(yán)格要求,本書盡量用相對(duì)簡(jiǎn)單易懂的例子來(lái)說(shuō)明所要介紹的技術(shù)點(diǎn)。如果讀者已經(jīng)擁有了基礎(chǔ)知識(shí),但不滿足于停留在初級(jí)開(kāi)發(fā)水平,希望在技術(shù)上尋求進(jìn)階,那么本書是非常適合的。本書是 Android技術(shù)的提高和進(jìn)階性質(zhì)的技術(shù)書籍,通過(guò)本書,讀者可以掌握前沿實(shí)用、高效便捷的 Android開(kāi)發(fā)技術(shù),并可以很快地把從本書學(xué)到的高級(jí)開(kāi)發(fā)技術(shù)應(yīng)用到具體的項(xiàng)目開(kāi)發(fā)實(shí)踐中。
四川大學(xué)的彭艦教授完成了本書的審校工作,四川大學(xué)的研究生弋沛玉、汪瑩、郭振杰、鄧力嘉、鐘昌康、曹先波、陳新鵬對(duì)本書的審校亦有貢獻(xiàn)。本書的順利完成和出版,離不開(kāi)北京航空航天大學(xué)出版社以及董宜斌編輯的支持和幫助,在此表示衷心的感謝。還要感謝 Android,謝謝 Android為這個(gè)世界帶來(lái)的美好!
本書難免存在不妥之處,如果讀者發(fā)現(xiàn)任何問(wèn)題或者有任何疑問(wèn),希望和作者交流,我的郵箱是zhangphil@live.com。
張 飛
2018年10月
張飛,2004年至2011年就讀于四川大學(xué)。2008年本科畢業(yè)后被保送攻讀計(jì)算機(jī)科學(xué)與技術(shù)碩士研究生。專注于Android新技術(shù)研究和應(yīng)用開(kāi)發(fā)。長(zhǎng)期活躍于中國(guó)Android技術(shù)領(lǐng)域,2017年11月受邀參加國(guó)際Android技術(shù)大會(huì)并作為嘉賓發(fā)表主題演講。寫有CSDN原創(chuàng)技術(shù)博客,博客閱讀量達(dá)到300萬(wàn) ,同時(shí)是CSDN博客專家和專欄作家。
第1章 高級(jí)圖形圖像處理…………………………………………………………… 1
1.1 ShapeDrawable、PaintDrawable與
OvalShape、RectShape、ArcShape ………………… 1
1.2 GradientDrawable梯度漸變 ……………………………………………………… 3
1.3 過(guò)渡動(dòng)畫的 TransitionDrawable …………………………………………………… 9
1.4 圓形圓角圖像 …………………………………………………………………… 10
1.5 ImageView 的setImageLevel和level-list
………………………………………… 13
1.6 紅色小圓球樣式的新消息提醒 …………………………………………………… 14
1.7 小 結(jié) …………………………………………………………………………… 18
第2章 圖形圖像渲染的梯度漸變 ………………………………………………… 20
2.1 線性梯度漸變渲染器 LinearGradient……………………………………………… 20
2.2 掃描梯度漸變渲染器SweepGradient……………………………………………… 23
2.3 放射環(huán)狀梯度漸變渲染器 RadialGradient ………………………………………… 25
2.4 xml配置線性梯度漸變 …………………………………………………………… 26
2.5 xml配置放射狀梯度漸變 ………………………………………………………… 31
2.6 xml配置掃描形梯度漸變 ………………………………………………………… 34
2.7 小 結(jié) …………………………………………………………………………… 35
第3章 由靜至動(dòng)的動(dòng)態(tài)拖曳
View及動(dòng)畫 ……………………………………… 36
3.1 alpha:透明漸變屬性動(dòng)畫 ………………………………………………………… 36
3.2 rotation:旋轉(zhuǎn)屬性動(dòng)畫 …………………………………………………………… 37
3.3 translation:位移屬性動(dòng)畫 ………………………………………………………… 38
3.4 scale:縮放屬性動(dòng)畫 ……………………………………………………………… 39
3.5 AnimatorSet:屬性動(dòng)畫集 ………………………………………………………… 40
3.6 ViewDragHelper:拖曳管控 ……………………………………………………… 42
3.7 小 結(jié) …………………………………………………………………………… 50
第4章
View高級(jí)特性 ……………………………………………………………… 51
4.1 橫豎屏切換不同尺寸的 View …………………………………………………… 51
4.2 onMeasure控制 View 的大小尺寸 ………………………………………………… 54
4.3 onLayout控制子 View 的空間位置 ……………………………………………… 59
4.4 小 結(jié) …………………………………………………………………………… 63
第5章 高級(jí)組件開(kāi)發(fā) ……………………………………………………………… 65
5.1 Android設(shè)備消息通知 …………………………………………………………… 65
5.2 狀態(tài)欄的通知消息點(diǎn)擊觸發(fā)事件啟動(dòng)后臺(tái)的 Activity………………………………… 68
5.3 消息通知的自定義布局…………………………………………………………… 69
5.4 WindowManager懸浮窗 ………………………………………………………… 70
5.5 白天/夜間模式標(biāo)準(zhǔn)實(shí)現(xiàn) ………………………………………………………… 72
5.6 小 結(jié) …………………………………………………………………………… 77
第6章 桌面部件
AppWidget……………………………………………………… 78
6.1 桌面部件 AppWidget的簡(jiǎn)單實(shí)現(xiàn) ………………………………………………… 78
6.2 桌面部件 AppWidget的定制開(kāi)發(fā) ………………………………………………… 84
6.3 簡(jiǎn)單音樂(lè)播放器的桌面部件 Widget ……………………………………………… 89
6.4 小 結(jié) …………………………………………………………………………… 95
第7章
OkHttp一攬子網(wǎng)絡(luò)技術(shù)解決方案 ………………………………………… 96
7.1 OkHttp異步方式下載 …………………………………………………………… 96
7.2 OkHttp同步方式加載數(shù)據(jù) ……………………………………………………… 100
7.3 OKHttp的post上傳 …………………………………………………………… 101
7.4 OkHttp的基本配置 …………………………………………………………… 104
7.6 小 結(jié) ………………………………………………………………………… 110
第8章 圖片加載利器
Glide ……………………………………………………… 112
8.1 Glide最簡(jiǎn)單的網(wǎng)絡(luò)圖片加載方式 ……………………………………………… 112
8.2 Glide加載gif動(dòng)態(tài)圖 …………………………………………………………… 113
8.3 Glide占位圖placeholder………………………………………………………… 114
8.4 Glide加載圖片的特殊效果 ……………………………………………………… 115
8.5 Glide內(nèi)存緩存和硬盤緩存 ……………………………………………………… 121
8.6 小 結(jié) ………………………………………………………………………… 123
第9章 高階Java多線程在
Android中的運(yùn)用 ………………………………… 124
9.1 多線程技術(shù)概述 ………………………………………………………………… 125
9.2 Java線程池 ThreadPoolExecutor………………………………………………… 126
9.3 Java線程池的調(diào)度ScheduledThreadPoolExecutor ……………………………… 129
9.4 Future、Callable類獲得線程返回結(jié)果 …………………………………………… 131
9.5 FutureTask線程類詳解 ………………………………………………………… 134
9.6 Java線程安全的 LinkedBlockingQueue類和 ConcurrentLinkedQueue類 …………… 136
9.7 小 結(jié) ………………………………………………………………………… 139
第10章 大數(shù)據(jù)、多任務(wù)、斷點(diǎn)續(xù)傳下載管理 …………………………………… 140
10.1 DownloadManager開(kāi)發(fā)簡(jiǎn)介 …………………………………………………… 140
10.2 DownloadManager下載狀態(tài)查詢 ……………………………………………… 145
10.3 DownloadManager下載進(jìn)度、存放目錄等 ……………………………………… 147
10.4 DownloadManager下載完成事件監(jiān)聽(tīng)…………………………………………… 148
10.5 小 結(jié) ………………………………………………………………………… 150
第11章 內(nèi)存與物理存儲(chǔ)高效緩存及策略 ……………………………………… 152
11.1 引入 LruCache內(nèi)存緩存技術(shù)的背景 …………………………………………… 152
11.2 內(nèi)存 LruCache緩存及算法的策略思想 ………………………………………… 153
11.3 二級(jí)緩存 LruCache和 DiskLruCache …………………………………………… 159
11.4 DiskLruCache緩存讀寫操作具體過(guò)程 ………………………………………… 162
11.5 小 結(jié) ………………………………………………………………………… 165
第12章 進(jìn)程間通信之
AIDL機(jī)制 ……………………………………………… 166
12.1 進(jìn)程間通信概述 ……………………………………………………………… 166
12.1.7 信號(hào)量 …………………………………………………………………… 169
12.1.8 套接字 …………………………………………………………………… 170
12.2 進(jìn)程間通信 …………………………………………………………………… 170
12.2.1 進(jìn)程間通信 AIDL之服務(wù)器端 …………………………………………… 171
12.2.2 進(jìn)程間通信 AIDL之客戶端 ……………………………………………… 173
12.3 進(jìn)程間通信 AIDL之雙向通信 ………………………………………………… 175
12.4 小 結(jié) ……………………………………………………………………… 179
第13章 框架性架構(gòu)體系 ………………………………………………………… 180
13.1 EventBus:靈活輕便的跨域消息通信 …………………………………………… 180
13.2 Lifecycle:從生命周期中解放出來(lái) ……………………………………………… 184
13.3 Android運(yùn)行時(shí)權(quán)限 …………………………………………………………… 187
13.4 小 結(jié) ………………………………………………………………………… 192
第14章 企業(yè)級(jí)開(kāi)發(fā) ORM
數(shù)據(jù)庫(kù)技術(shù) ………………………………………… 194
14.1 ORMLite數(shù)據(jù)庫(kù)環(huán)境搭建 ……………………………………………………… 194
14.2 ORMLite數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā) ……………………………………………………… 195
14.3 ORMLite的外鍵關(guān)聯(lián)映射 ……………………………………………………… 200
14.4 Android平臺(tái)上的greenDAO 關(guān)系數(shù)據(jù)庫(kù) ……………………………………… 205
14.5 greenDAO 關(guān)系映射模型 ……………………………………………………… 213
14.6 小 結(jié) ………………………………………………………………………… 218
第15章 多媒體與圖像識(shí)別掃描技術(shù) …………………………………………… 219
15.1 Android二維碼/條形碼技術(shù)方案綜述 ………………………………………… 219
15.2 Android二維碼/條形碼技術(shù)開(kāi)發(fā)實(shí)踐 ………………………………………… 220
15.3 SurfaceView 簡(jiǎn)介與實(shí)例 ……………………………………………………… 223
15.4 TextureView 與SurfaceTexture實(shí)現(xiàn)相機(jī)拍照 ………………………………… 226
15.5 TextureView 與 MediaPlayer實(shí)現(xiàn)視頻播放 …………………………………… 231
15.6 小 結(jié) ………………………………………………………………………… 233
第16章 藍(lán)牙網(wǎng)絡(luò)通信技術(shù) ……………………………………………………… 235
16.1 發(fā)現(xiàn)藍(lán)牙設(shè)備 ………………………………………………………………… 236
16.2 PairedBluetoothDevices:藍(lán)牙設(shè)備配對(duì) ………………………………………… 241
16.3 藍(lán)牙設(shè)備連接的建立…………………………………………………………… 243
16.4 藍(lán)牙設(shè)備之間的數(shù)據(jù)傳輸 ……………………………………………………… 247
16.5 手機(jī)端通過(guò)藍(lán)牙發(fā)送文件到電腦端 …………………………………………… 252
16.6 小 結(jié) ………………………………………………………………………… 260
第17章
RxJava/RxAndroid脈絡(luò)清晰的響應(yīng)式編程 …………………………… 261
17.1 RxJava/RxAndroid技術(shù)概論 …………………………………………………… 261
17.2 intervalRange與interval間隔、周期性地發(fā)射數(shù)據(jù)流 …………………………… 264
17.3 map和flatMap操作符 ………………………………………………………… 266
17.4 zip、merge和concat操作符 …………………………………………………… 269
17.5 scan和filter操作符 …………………………………………………………… 272
17.6 take、skip和takeLast操作符 …………………………………………………… 275
17.7 ofType根據(jù)類型選擇輸出結(jié)果 ………………………………………………… 277
17.8 distinct與distinctUntilChanged操作符 ………………………………………… 279
17.9 doAfterNext和doOnNext接力鏈?zhǔn)讲僮?……………………………………… 280
17.10 buffer緩沖操作符 …………………………………………………………… 282
17.11 retry錯(cuò)誤重試 ……………………………………………………………… 285
17.12 小 結(jié) ……………………………………………………………………… 288
第18章
AndroidDataBinding:MVVM 架構(gòu)基石,數(shù)據(jù)驅(qū)動(dòng) App運(yùn)轉(zhuǎn) ……… 289
18.1 AndroidDataBinding概述 ……………………………………………………… 289
18.2 初識(shí) AndroidDataBinding……………………………………………………… 291
18.3 notifyPropertyChanged:動(dòng)態(tài)更新數(shù)據(jù) ………………………………………… 295
18.4 @=操作符雙向綁定…………………………………………………………… 298
18.5 數(shù)據(jù)綁定的 BindingAdapter適配器 …………………………………………… 299
18.6 BindingMethods可實(shí)現(xiàn) BindingAdapter功能 …………………………………… 301
18.7 基于InverseBindingAdapter實(shí)現(xiàn)雙向綁定之反向綁定 ………………………… 302
18.8 基于InverseBindingMethods實(shí)現(xiàn)雙向綁定之反向綁定 ……………………………… 308
18.9 基于 BindingAdapter與InverseBindingAdapter實(shí)現(xiàn)SeekBar雙向綁定…………… 310
18.10 基于InverseBindingMethods實(shí)現(xiàn)SeekBar雙向綁定 ……………………………… 313
18.11 AndroidDataBinding技術(shù)在傳統(tǒng)ListView中的運(yùn)用………………………………… 315
18.12 AndroidDataBinding技術(shù)在 RecyclerView中的運(yùn)用 ……………………………… 317
18.13 AndroidDataBinding的 Lambda表達(dá)式 ……………………………………… 318
18.14 小 結(jié) ……………………………………………………………………… 320
第19章
AndroidNDK 開(kāi)發(fā)技術(shù) ………………………………………………… 321
19.1 JavaJNI技術(shù)簡(jiǎn)介……………………………………………………………… 321
19.2 AndroidNDK 開(kāi)發(fā)環(huán)境配置 …………………………………………………… 323
19.3 AndroidStudio自動(dòng)生成的 NDK工程代碼結(jié)構(gòu)分析 ……………………………… 325
19.4 自定義實(shí)現(xiàn) Android的 NDK 庫(kù) ………………………………………………… 328
19.5 小 結(jié) ………………………………………………………………………… 332
第20章
Android傳感器 ………………………………………………………… 333
20.1 Android傳感器開(kāi)發(fā)概述 ……………………………………………………… 334
20.2 Android線性加速度傳感器 …………………………………………………… 335
20.3 Android近距離傳感器 ………………………………………………………… 338
20.4 Android壓力傳感器 …………………………………………………………… 340
20.5 Android光強(qiáng)傳感器 …………………………………………………………… 341
20.6 Android方位傳感器 …………………………………………………………… 342
20.7 Android運(yùn)動(dòng)計(jì)步傳感器 ……………………………………………………… 345
20.8 小 結(jié) ………………………………………………………………………… 346
參考文獻(xiàn) …………………………………………………………………………… 348