《Android開發(fā)進(jìn)階》(何紅輝)電子書網(wǎng)盤下載免費(fèi)在線閱讀
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)含山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
資源鏈接:
鏈接:
提取碼: 0q3x ?
書名:Android開發(fā)進(jìn)階
作者:何紅輝
豆瓣評分:6.0
出版社:人民郵電出版社
出版年份:2016-2-1
頁數(shù):378
內(nèi)容簡介:
本書是一本專門介紹Android開發(fā)的圖書。書中首先對Android開發(fā)的核心知識點(diǎn)進(jìn)行深入講解,然后介紹單元測試、代碼規(guī)范、版本控制、重構(gòu)、架構(gòu)等重要的知識,使得讀者在深入掌握技術(shù)的同時也幫助他們開闊眼界,且能夠以更專業(yè)的方式設(shè)計(jì)應(yīng)用軟件,完成從只會實(shí)現(xiàn)功能的初級程序員到軟件工程師、設(shè)計(jì)師的轉(zhuǎn)變。
本書的主要內(nèi)容為:構(gòu)成Android系統(tǒng)基石的四大組件、創(chuàng)造出豐富多彩的UI設(shè)計(jì)的控件、保證App流暢的多線程開發(fā)、必知必會的HTTP網(wǎng)絡(luò)請求應(yīng)用、數(shù)據(jù)存儲的核心SQLite數(shù)據(jù)庫、讓程序的性能優(yōu)化、讓程序更整潔的代碼規(guī)范、管理程序的好幫手Git版本控制,以及需要掌握的高級技術(shù),如單元測試、六大原則與設(shè)計(jì)模式、重構(gòu)和綜合實(shí)戰(zhàn)等。
本書適合Android開發(fā)初學(xué)者、程序員學(xué)習(xí),也適合作為大中專院校相關(guān)專業(yè)的師生用書和培訓(xùn)學(xué)校的教材。
作者簡介:
何紅輝 : 前友盟(阿里巴巴集團(tuán))Android工程師,CSDN博客專家,活躍于國內(nèi)各大技術(shù)社區(qū),熱愛開源,熱愛技術(shù),熱愛分享。Android事件總線開源庫(AndroidEventBus)、Colorful作者,開發(fā)技術(shù)前線站長。
還記得第一次聽到 Coroutines 的時候,納悶了一下,口瑞停,這是什么新的番號招式(誤),之后其實(shí)也沒有多在意了,好一段時間,因?yàn)橐粋€檔案的 I/O 會把 UI Thread 卡住,必須要用異步程序去處理,寫 Handler Thread 可以避免,這也是最基礎(chǔ)的方式,缺點(diǎn)也很明顯某些時候還是避不掉,寫 RX 又總覺得微妙感覺有點(diǎn)殺雞用牛刀的感覺,后來看了一下決定用 Coroutines ,于是有了本篇文章。
普通情況下,執(zhí)行的順序會是很直白的 functionA() - functionB() - functionC() 。
如果只有一個 thread ,這樣很順暢沒問題。
但假如這是一個跑在 main thread 上,而 ·function A· 是需要另一個 thread 的處理結(jié)果,而該結(jié)果是需要該 thread 耗費(fèi)長時間作業(yè)才可以獲得的。這邊姑且稱為 IO thread 好了。那不就意味著 function A 得等到 IO thread 處理結(jié)束并告知結(jié)果才能繼續(xù)執(zhí)行 function A 乃至 function B 之后才是 function C 呢?
那在等待 function A 的時候 main thread 啥事都不能做,只能 idle 在那邊動也不動。
這如果是在 Android main thread 上,這樣的行為會讓畫面 freeze ,時間稍微長一點(diǎn)就會 ANR 被 OS 當(dāng)作壞掉進(jìn)行異常排除了。
其實(shí)這個異步問題解決方案很多,諸如自己寫一個 callback ,或者自干 Handler thread 去控管或者是用 RX ,去訂閱之類。某些時候顯得不直觀,或者使用起來麻煩,總有種殺雞何需使用牛刀的感覺。
那有沒有可能?我就寫成上面那樣,但是當(dāng) function A 在等待 IO thread 時,讓 main thread 去做其他的事情,等到 IO thread 結(jié)束耗時處理后,再回來繼續(xù)執(zhí)行 function A , function B 、 function C 呢?
是的,可以,這個解決方案便是 Coroutine 。
Coroutines ,這個單字會被標(biāo)成錯字,理由是他其實(shí)是兩個單字合并而成的,分別是 cooperation + routine, cooperation 意指合作,routine 意指例行作業(yè)、慣例,照這里直接翻譯就會是合作式例行作業(yè)。
想到輝夜姬讓人想告白提到了慣例行為,也是念作 routine
那我們看到的翻譯多半會是協(xié)程、協(xié)作程序…這樣講沒啥前后感,誰協(xié)助程序?協(xié)助啥程序? 總之就是滿頭的問號。
這里 routine 指得是程序中被呼叫的 function、method ,也就是說,我們將 function 、method 協(xié)同其他更多的 function、method 共同作業(yè)這件事情稱為 Coroutines 。
協(xié)同作業(yè)聽起來還是很抽象,具體協(xié)同什么呢?
這便是 Coroutines 最典型的特色,允許 method 被暫停( suspended)執(zhí)行之后再回復(fù)(resumed)執(zhí)行,而暫停執(zhí)行的 method 狀態(tài)允許被保留,復(fù)原后再以暫停時的狀態(tài)繼續(xù)執(zhí)行。
換句話說,就是我在 main thread 執(zhí)行到 function A 需要等 IO thread 耗時處理的結(jié)果,那我先暫停 function A , 協(xié)調(diào)讓出 main thread 讓 main thread 去執(zhí)行其他的事情,等到 IO thread 的耗時處理結(jié)束后得到結(jié)果后再回復(fù) function A 繼續(xù)執(zhí)行,已得到我要的結(jié)果,這便是 Coroutines 的概念,這聽起來不是很簡單了呢?
事實(shí)上這個概念早在 1964 年就已經(jīng)被提出了,而很多語言也都有這樣的概念,只是 Android 上頭類似的東西一直沒有被積極推廣,直到 Kotlin 成為官方語言后, Coroutines 以 Support Library 的形式被推廣才又在 Android 業(yè)界流行起來。
首先,因?yàn)?Kotlin 的 Coroutine 并沒有包含在原有包裝中,而是以 Support Library 的形式提供開發(fā)者使用,所以需要另外導(dǎo)入該 Library。
這里選用這個版本進(jìn)行演示,實(shí)際中可以根據(jù)自己的需要修改版本。
那因?yàn)槭窃?Android 上使用的, Android 上頭的 main thread 跟普通 java 有點(diǎn)不一樣,所以還需要另一個 implementation,不然會報(bào)錯。
導(dǎo)入之后就可以開始使用了。
這邊我想做的是畫面上有一個會倒數(shù)的 Text ,用 Coroutines 可以簡單地做到
那跑起來結(jié)果就像這樣:
這樣如果要 Thread 有相同的結(jié)果可以寫成這樣:
這樣會有什么問題就是另一個故事了,至少現(xiàn)在這樣不會馬上出現(xiàn) Exception (最常見的就是使用者離開畫面沒多久就出現(xiàn)一個 Exception),不過也并不是說用 Coroutines 就不會發(fā)生這些問題,記得這些做法沒有什么優(yōu)劣,差別在都選擇就是了。
說回 Coroutines ,那跟 Thread 一樣,某些時候我們會想要臨時把它停住,那 GlobalScope.launch 會回傳一個 Job class 的玩意
想要把它停住的話就用 cancel 即可
Scope 指得是范圍, Coroutines 可以作用的范圍。在 Main thread 上或是 IO thread 上,又或者希望開更多的 Worker thread,然后是可以在某個控制流(e.g Activity 的生命周期)中可被控制的。
原則上,在 Kotlin 里頭使用任何標(biāo)記 suspend 的 method(后面會提)都會在 Scope 里面,這樣才可以控制 Coroutines 的行進(jìn)與存活與否。
那這邊舉的例子, GlobalScope 繼承自 CoroutineScope 。它是 CoroutineScope 的一個實(shí)作,它的概念就是最高層級的 Coroutines ,它的作用的范圍伴隨著 Application 的生命周期,那其實(shí)他的概念與 Dispatch.Unconfined 相同(待會會提到),用他其實(shí)可以避免 Coroutines 被過早結(jié)束,但也要記得是,這個用法類似直接呼叫靜態(tài)函數(shù),需要注意。
那如果直接實(shí)作 CoroutineScope 呢?
那會要求實(shí)作一個 CoroutineContext ,這是什么玩意?指的就是 Coroutines 作用的情景,這邊可以指定他是在 Main thread 上或者就直接弄一個 Job 給他:
這樣 launch 的時候就會使用這個 Job 來操作了,如果沒有特別定義,那這個 Job 就是跑在 Worker thread 上了,用它更新 UI 會出現(xiàn) Exception ,這方面可以依據(jù)自己的需求去做調(diào)整。
不過更多時候我會希望他能夠跑在 Main Thread 上, Koltinx Coroutine 有提供 CoroutineScope 的實(shí)作 - MainScrope
小明首先需要購買一本Android入門的書籍,為了更快地學(xué)習(xí)Android,小明業(yè)余時間也都用來一邊看書一邊照著書中的例子敲代碼,結(jié)果2周時間小明就把這本書學(xué)了一遍??赐赀@本書后,小明對Android的歷史、結(jié)構(gòu)、代碼規(guī)范等都有了一個大概的了解,并且,小明已經(jīng)可以寫出一些簡單的Activity了。這個時候在小明眼里,Android開發(fā)很簡單很好玩,通過在xml中擺放一些按鈕文本框什么的就可以做一些界面了。
小明開始跟著他的技術(shù)導(dǎo)師做需求,一些簡單的小需求小明自然是不在話下了。突然有一天來了一個需求,該需求要求小明在Activity中為一個button加一個動畫效果,小明慌了:“完全沒接觸過,書上也沒有講,怎么辦呢?”小明冷靜了下,打開了百度搜索,輸入“Android 動畫”,打開前幾個鏈接,小明恍然大悟,照著網(wǎng)上的例子把需求給實(shí)現(xiàn)了。后來導(dǎo)師告訴他:“學(xué)好Android,官方文檔是必須看的,既全面又權(quán)威”。然后小明如獲至寶,花了一年時間把上面的guide和training都看了一遍,并且他還動手抄了幾個小例子。
有一天,小明又需要做一個動畫相關(guān)的需求,這可難不倒小明,它熟練地打開了,輸入“Android 動畫”,突然他楞了一下:”總不能每次寫動畫都要百度一下吧!“,于是他在CSDN開了一個博客,把動畫相關(guān)的知識點(diǎn)都寫上去,為的是后面再寫動畫相關(guān)的代碼就不用百度去搜了,事實(shí)如何呢?后面再寫動畫相關(guān)的代碼,小明的確不用再去百度搜了,因?yàn)橥ㄟ^寫一篇動畫博客,他把動畫相關(guān)的細(xì)節(jié)都已經(jīng)記住了,這樣他就可以不用再去參考任何文檔了,后來小明還學(xué)會了把一些瑣碎的不方便放在博客上的東西寫到了印象筆記上面,什么時候忘了10秒鐘以內(nèi)都可以快速找回來,而不是花10分鐘去再次搜索一遍。
這里總結(jié)一下,Android入門的時候,需要有一本入門書,好好學(xué)習(xí)書中的內(nèi)容,同時花一年時間把Android官方文檔中的training和guide看一遍,同時通過寫博客和記筆記的方式來做總結(jié),建議讓自己的每篇博客都有價值些。通過一年時間的學(xué)習(xí),相信每個人都可以達(dá)到中級工程師的水平。
技術(shù)要求:
- 基本知識點(diǎn)
比如四大組件如何使用、如何創(chuàng)建Service、如何進(jìn)行布局、簡單的自定義View、動畫等常見技術(shù)
- 書籍推薦
《第一行代碼 Android》、《瘋狂Android》
中級工程師
小明經(jīng)過一年的努力學(xué)習(xí)終于成為Android中級工程師了,月薪變成了17k。到了中級工程師,已經(jīng)可以在公司里干很多體力活了,但是一些很重要的任務(wù)小明還不能一個人承擔(dān)起來,這個時候小明需要學(xué)習(xí)的內(nèi)容就很多了,如下所示:
- AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的區(qū)別;
- Binder:從Java層大概理解Binder的工作原理,懂Parcel對象的使用;
- 多進(jìn)程:熟練掌握多進(jìn)程的運(yùn)行機(jī)制,懂Messenger、Socket等;
- 事件分發(fā):彈性滑動、滑動沖突等;
- 玩轉(zhuǎn)View:View的繪制原理、各種自定義View;
- 動畫系列:熟悉View動畫和屬性動畫的不同點(diǎn),懂屬性動畫的工作原理;
- 懂性能優(yōu)化、熟悉mat等工具
- 懂點(diǎn)常見的設(shè)計(jì)模式
學(xué)習(xí)方法
閱讀進(jìn)階書籍,閱讀Android源碼,閱讀官方文檔并嘗試自己寫相關(guān)的技術(shù)文章,需要有一定技術(shù)深度和自我思考。在這個階段的學(xué)習(xí)過程中,有2個點(diǎn)是比較困擾大家的,一個是閱讀源碼,另一個是自定義View以及滑動沖突。
如何閱讀源碼呢?這是個頭疼的問題,但是源碼必須要讀。閱讀源碼的時候不要深入代碼細(xì)節(jié)不可自拔,要關(guān)注代碼的流程并盡量挖掘出對應(yīng)用層開發(fā)有用的結(jié)論。另外仔細(xì)閱讀源碼中對一個類或者方法的注釋,在看不懂源碼時,源碼中的注釋可以幫你更好地了解源碼中的工作原理,這個過程雖然艱苦,但是別無他法。
如何玩轉(zhuǎn)自定義View呢?我的建議是不要通過學(xué)習(xí)自定義view而學(xué)習(xí)自定義view。為什么這么說呢?因?yàn)樽远xview的種類太多了,各式各樣的絢麗的自定義效果,如何學(xué)的玩呢!我們要透過現(xiàn)象看本質(zhì),更多地去關(guān)注自定義view所需的知識點(diǎn),這里做如下總結(jié):
- 搞懂view的滑動原理
- 搞懂如何實(shí)現(xiàn)彈性滑動
- 搞懂view的滑動沖突
- 搞懂view的measure、layout和draw
- 然后再學(xué)習(xí)幾個已有的自定義view的例子
- 最后就可以搞定自定義view了,所謂萬變不離其宗
大概再需要1-2年時間,即可達(dá)到高級工程師的技術(shù)水平。我個人認(rèn)為通過《Android開發(fā)藝術(shù)探索》和《Android群英傳》可以縮短這個過程為0.5-1年。注意,達(dá)到高級工程師的技術(shù)水平不代表就可以立刻成為高級工程師(受機(jī)遇、是否跳槽的影響),但是技術(shù)達(dá)到了,成為高級工程師只是很簡單的事。
技術(shù)要求:
- 稍微深入的知識點(diǎn)
AIDL、Messenger、Binder、多進(jìn)程、動畫、滑動沖突、自定義View、消息隊(duì)列等
- 書籍推薦
《Android開發(fā)藝術(shù)探索》、《Android群英傳》
高級工程師
小明成為了夢寐以求的高級工程師,月薪達(dá)到了20k,還拿到了一丟丟股票。這個時候小明的Android水平已經(jīng)不錯了,但是小明的目標(biāo)是資深工程師,小明聽說資深工程師月薪可以達(dá)到30k+。
為了成為Android資深工程師,需要學(xué)習(xí)的東西就更多了,并且有些并不是那么具體了,如下所示:
- 繼續(xù)加深理解”稍微深入的知識點(diǎn)“中所定義的內(nèi)容
- 了解系統(tǒng)核心機(jī)制:
1. 了解SystemServer的啟動過程
2. 了解主線程的消息循環(huán)模型
3. 了解AMS和PMS的工作原理
4. 能夠回答問題”一個應(yīng)用存在多少個Window?“
5. 了解四大組件的大概工作流程
6. …
- 基本知識點(diǎn)的細(xì)節(jié)
1. Activity的啟動模式以及異常情況下不同Activity的表現(xiàn)
2. Service的onBind和onReBind的關(guān)聯(lián)
3. onServiceDisconnected(ComponentName className)和binderDied()的區(qū)別
4. AsyncTask在不同版本上的表現(xiàn)細(xì)節(jié)
5. 線程池的細(xì)節(jié)和參數(shù)配置
6. …
- 熟悉設(shè)計(jì)模式,有架構(gòu)意識
學(xué)習(xí)方法
這個時候已經(jīng)沒有太具體的學(xué)習(xí)方法了,無非就是看書、看源碼和做項(xiàng)目,平時多種總結(jié),盡量將知識融會貫通從而形成一種體系化的感覺。同時這個階段對架構(gòu)是有一定要求的,架構(gòu)是抽象的,但是設(shè)計(jì)模式是具體的,所以一定要加強(qiáng)下設(shè)計(jì)模式的學(xué)習(xí)。關(guān)于設(shè)計(jì)模式的學(xué)習(xí),最近一本新書推薦給大家《Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》,既可以學(xué)習(xí)設(shè)計(jì)模式,又可能體會到Android源碼中的設(shè)計(jì)思想,我最近也在閱讀此書。
技術(shù)要求:
- 稍微深入的知識點(diǎn)
- 系統(tǒng)核心機(jī)制
- 基本知識點(diǎn)的細(xì)節(jié)
- 設(shè)計(jì)模式和架構(gòu)
- 書籍推薦
《Android開發(fā)藝術(shù)探索》、《Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》、《Android內(nèi)核剖析》
資深工程師
這個階段的程序員也許并沒有太具體的學(xué)習(xí)路線了。
說的是剛剛起步學(xué)習(xí)的同學(xué),假如開始沒有任何的開發(fā)經(jīng)驗(yàn)的話,千萬不要著急,不要想著在短時間內(nèi)就把一個語言學(xué)習(xí)好,因?yàn)槟阒皼]有任何的學(xué)習(xí)經(jīng)驗(yàn),在這個過程中需要有耐心地學(xué)習(xí)完JAVA的基礎(chǔ)知識,然后才開始踏上Android開發(fā)之旅。一類同學(xué)是只之前做過JAVA開發(fā)經(jīng)驗(yàn)的,這類同學(xué)可以在Android上迅速上手,但是同樣的是不可忽略Android的一些基礎(chǔ)知識,只有把基礎(chǔ)掌握好了,才能在后期取得大的進(jìn)步。 二、Android基礎(chǔ)知識學(xué)習(xí) 在掌握好JAVA基礎(chǔ)知識后,接下來就是學(xué)習(xí)Android基礎(chǔ)知識和如何查看開發(fā)文檔了,在這個階段我認(rèn)為是學(xué)習(xí)最有勁頭和最有收獲的時候,因?yàn)閺囊粺o所知到了解是會讓人有收獲良多的感覺,事實(shí)上在這一階段也是學(xué)習(xí)了很多,至少知道如何建立工程,知道一些基本的機(jī)制很常用函數(shù)的用法,這個階段會出現(xiàn)很多的問題,往往一個很低級的問題都會把你難倒,而這階段正式培養(yǎng)學(xué)習(xí)能力的好時機(jī),還是那句話,凡是遇到問題第一個想的是自己去解決,自己解決不了的,用百度用谷歌,要學(xué)會使用搜索引擎,大部分的時候問題都能得到解決,因?yàn)槟阌龅竭^的問題別人早就遇到過了,假如搜索引擎也找不到好的答案,這時候可以到論壇發(fā)帖問,網(wǎng)上牛人很多,也可以選擇到群里咨詢。 三、Android開發(fā)進(jìn)階 學(xué)習(xí)完Android基礎(chǔ)知識以后,很多同學(xué)很快就會感覺到學(xué)習(xí)停步不前,感覺自己似懂非懂,我覺得這個時候是學(xué)習(xí)最關(guān)鍵的時候,因?yàn)橐坏┠闾こ鲞@一步之后,你對Android的理解就會跟更加透徹,做起開發(fā)也會更加有信心,但是怎樣跨過這一階段,我根據(jù)自己的經(jīng)驗(yàn)是首先是保持對自己的信心,自己找一個比較簡單的項(xiàng)目做做或者找一些應(yīng)用的源代碼研究研究,然后自己山寨出來一個,這樣你也會有了學(xué)習(xí)的方向,因?yàn)槟阍诹私饬嘶A(chǔ)知識以后急切需要證明一下自己到底是學(xué)到了什么東西,而開發(fā)出一個自己的簡單應(yīng)用,就是最大的證明了,而且在開發(fā)應(yīng)用的時候,肯定會遇到很多的問題,而在獨(dú)立解決bug的同時,你已經(jīng)掌握了獨(dú)立處理問題的能力。
Android方面進(jìn)階的書籍很少,如果要只幾本:
《Android開發(fā)藝術(shù)探索》
《APP研發(fā)錄》
《Android高級進(jìn)階》
《深入理解Android內(nèi)核設(shè)計(jì)思想》
這幾本書非常值得一讀。
進(jìn)階除了理論外,更多的是經(jīng)驗(yàn)和更深入地思考,這些都是需要親身實(shí)踐才會印象深刻,就算你看了書,也不一定能夠吸收,因?yàn)槟銢]遇到過,可能無法理解其中的含義。舉幾個例子:
在java的finallize方法中釋放與類相關(guān)的資源是不靠譜的;
在onCreate方法中直接顯示PopupWindow會掛掉;
e.printStackTrace會比較耗時(頻繁調(diào)用就知道了);
Activity設(shè)置為透明主題后,某些系統(tǒng)回調(diào)方法不會被調(diào)用;
這些知識在沒有親身實(shí)踐之前去看書或者官方文檔,多半會一帶而過,但遇到這些問題之后去看書或者查資料會讓你更加印象深刻,很難忘記。
還有到了一定程度,就不能只專注于Android了,要想更好地理解每個知識點(diǎn),需要看其它方面的書和閱讀源碼。比如網(wǎng)絡(luò)方面需要熟悉網(wǎng)絡(luò)協(xié)議;性能方面需要了解算法、JVM和操作系統(tǒng)原理;程序設(shè)計(jì)需要了解設(shè)計(jì)模式;要了解某一個類的實(shí)現(xiàn)原理需要閱讀源碼;音方面需要了解編解碼、數(shù)字信號處理方面的內(nèi)容