《Android程序員面試筆試寶典》覆蓋了Android開(kāi)發(fā)中的各個(gè)主要方面,所給出的試題均取材于各大IT公司的Android面試真題。全書(shū)分為Java部分與Android部分。因?yàn)锳ndroid開(kāi)發(fā)是用Java語(yǔ)言來(lái)編寫(xiě)的,所以這里所講的Java知識(shí)都是基礎(chǔ)方面,而且跟Android開(kāi)發(fā)有關(guān)的其他基礎(chǔ)知識(shí)都會(huì)在Java部分進(jìn)行講解。而Android部分,則從面試中經(jīng)?嫉闹R(shí)點(diǎn)入手,對(duì)Android進(jìn)行全面的學(xué)習(xí),對(duì)常見(jiàn)面試真題進(jìn)行分析與講解,培養(yǎng)讀者解決面試題思路的同時(shí),也能系統(tǒng)學(xué)習(xí)到Android開(kāi)發(fā)。
《Android程序員面試筆試寶典》內(nèi)容豐富,講解思路清晰且詳細(xì),涵蓋的知識(shí)點(diǎn)非常多,不但是一本用來(lái)解決程序員面試的Android實(shí)用工具書(shū),也是一本適合任何Android開(kāi)發(fā)者學(xué)習(xí)的好書(shū)。
適讀人群 :Android、Java和Web 開(kāi)發(fā)人員 軟件工程師 高等院校計(jì)算機(jī)專業(yè)師生
詳細(xì)分析Android核心組件、面試真題,揭開(kāi)華為、小米等知名企業(yè)Android面試的機(jī)密
細(xì)分Android面試?yán)},幫助讀者查遺補(bǔ)漏,重點(diǎn)攻破,事半功倍
附贈(zèng)全書(shū)代碼,增加Java擴(kuò)展知識(shí),由點(diǎn)成線,舉一反三,傳授靈活應(yīng)用Android及面試關(guān)鍵技巧
不知不覺(jué)已經(jīng)過(guò)了半年,而在這半年里我跟另一位伙伴順利完成了這本關(guān)于Android(安卓)面試方面的技術(shù)書(shū)。雖然編寫(xiě)過(guò)程辛苦,但一想到可以把自己一直以來(lái)總結(jié)的知識(shí)與經(jīng)驗(yàn)分享給大家,就有種莫名的興奮感,這也是我們撰寫(xiě)本書(shū)的初衷,希望能對(duì)正在學(xué)習(xí)安卓的或者決定要學(xué)習(xí)安卓開(kāi)發(fā)的朋友有所幫助,哪怕是只有一點(diǎn),只要能幫助到各位,這樣也足矣。
回想大學(xué)畢業(yè)時(shí),還沒(méi)確定好自己該往哪個(gè)方向去走向編程這個(gè)1/0世界,因?yàn)轳R上又是求職季,感覺(jué)自己Java基礎(chǔ)還行,所以從此就選擇安卓開(kāi)發(fā)這條路了。直到現(xiàn)在,自己雖然早已不是當(dāng)初那個(gè)懵懂的菜鳥(niǎo),但在安卓開(kāi)發(fā)上,也一直碰到很多問(wèn)題。慶幸的是,我都堅(jiān)持下來(lái),一直系統(tǒng)地學(xué)習(xí)安卓知識(shí),鍛煉自己的編程能力,不斷積累自身的項(xiàng)目經(jīng)驗(yàn)。
所以我始終認(rèn)為,要學(xué)習(xí)好安卓,或者是其他編程語(yǔ)言,都要堅(jiān)持。再一個(gè)就是要選對(duì)方法,怎樣在學(xué)習(xí)的過(guò)程中避坑,而不是一股腦地堅(jiān)持就行了。我開(kāi)始學(xué)習(xí)安卓的那段時(shí)期經(jīng)常會(huì)不明所以然,后來(lái)自己不斷去看相關(guān)書(shū)籍和網(wǎng)上的大神寫(xiě)的技術(shù)文章,這才知道是因?yàn)樽约宏P(guān)于安卓的知識(shí)面太窄了,限制了我的思維。可是就算知道自己知識(shí)面窄又能怎樣,畢竟一個(gè)人的知識(shí)體系并不能一下子就豐富起來(lái)。所以這時(shí)我想到了可以先收集安卓開(kāi)發(fā)中各種知識(shí)點(diǎn)的簡(jiǎn)介,因?yàn)橥ǔ_@些簡(jiǎn)介都涵蓋了對(duì)各種知識(shí)點(diǎn)的作用的描述,然后我再把它們制作成思維導(dǎo)圖,這樣雖然不能短時(shí)間把所有知識(shí)都琢磨透,但起碼讓我知道它們是干什么的,有什么用,這樣我腦海中就形成了一個(gè)框架,能把開(kāi)發(fā)中的知識(shí)點(diǎn)串聯(lián)起來(lái),就不會(huì)再有那種迷惘感,學(xué)習(xí)起來(lái)也更加高效了。先宏觀了解大概,讓自己有個(gè)知識(shí)框架,然后過(guò)關(guān)斬將,循序漸進(jìn)地攻克每一個(gè)知識(shí)點(diǎn)。
最后,既然是從事開(kāi)發(fā)工作,那就一定要實(shí)踐,編程能力才是你的核心競(jìng)爭(zhēng)力,努力寫(xiě)好你的代碼。
本書(shū)內(nèi)容
本書(shū)涵蓋了Java基礎(chǔ)、Android四大組件(Activity、Service、ContentProvider和BroadcastReceiver)、布局、自定義View、動(dòng)畫(huà)框架、常用的第三方框架(Rxjava、Retrofit、OkHttp和Glide等)、消息異步機(jī)制、事件分發(fā)機(jī)制、MVC/MVP/MVVM和跨進(jìn)程通信等知識(shí)點(diǎn)的講解,這些知識(shí)點(diǎn)不僅在面試的時(shí)候經(jīng)?疾欤趯(shí)際開(kāi)發(fā)中也是經(jīng)常要用到的。所以本書(shū)將著重詳細(xì)講解它們,讓大家能切實(shí)理解,務(wù)必讓看本書(shū)的讀者能培養(yǎng)自己思考問(wèn)題的思路。畢竟隨著技術(shù)的發(fā)展與進(jìn)步,安卓開(kāi)發(fā)所涉及的東西也會(huì)越來(lái)越多,這樣公司對(duì)面試者的要求也會(huì)越來(lái)越高,考核的面試題的內(nèi)容和難度也會(huì)隨之變多與加深。但是,萬(wàn)變不離其宗,只要掌握了每個(gè)知識(shí)點(diǎn)以及它的解題思路,那么不僅能用于面試,在開(kāi)發(fā)上也會(huì)水到渠成。而本書(shū)正是基于這樣的目的來(lái)講解有關(guān)安卓開(kāi)發(fā)中的知識(shí)以及面試題。
致謝
直到現(xiàn)在,我還不敢相信自己能完成本書(shū)的撰寫(xiě)。這半年的時(shí)間,要感謝的人太多,沒(méi)有他們,我恐怕是完成不了本書(shū)的。
首先,我要在這里感謝《Java程序員面試筆試寶典》的作者何昊先生與薛鵬先生。當(dāng)初,我還是一名默默無(wú)聞的安卓碼農(nóng),在微信公眾號(hào)上偶爾發(fā)表一些自己總結(jié)的技術(shù)文章。何昊先生在看了我公眾號(hào)上的文章后,邀我寫(xiě)一本關(guān)于安卓面試方面的書(shū),而我也最終在他的鼓勵(lì)下踏上了寫(xiě)書(shū)的道路。薛鵬先生也在我編寫(xiě)本書(shū)的過(guò)程中給予了很大的幫助。還有,機(jī)械工業(yè)出版社計(jì)算機(jī)分社時(shí)靜副社長(zhǎng)與尚晨編輯,感謝你們?yōu)楸緯?shū)給出的建議與幫助。
其次,我要感謝我的父母,因?yàn)闆](méi)有你們背后的支持與理解,我是完成不了本書(shū)的編寫(xiě)。
最后
盡管我們已經(jīng)盡力去編寫(xiě)了,但畢竟精力有限,可能也會(huì)在某些知識(shí)的講解過(guò)程中出現(xiàn)紕漏與錯(cuò)誤,懇請(qǐng)讀者批評(píng)指正,也希望大家能將發(fā)現(xiàn)的問(wèn)題向我反饋,不勝感激。除此之外,也歡迎大家與我聯(lián)系,交流安卓或者編程相關(guān)的問(wèn)題。
編 者
前言
第1章 四大組件1
1.1 活動(dòng)1
1.1.1 生命周期1
1.1.2 啟動(dòng)模式2
1.1.3 碎片5
1.1.4 常見(jiàn)面試筆試真題6
1.2 服務(wù)17
1.2.1 Android線程17
1.2.2 生命周期17
1.2.3 服務(wù)類型18
1.2.4 Handler機(jī)制18
1.2.5 常見(jiàn)面試筆試真題19
1.3 廣播接收器26
1.3.1 動(dòng)態(tài)注冊(cè)與靜態(tài)注冊(cè)26
1.3.2 廣播類型26
1.3.3 發(fā)送廣播27
1.3.4 常見(jiàn)面試筆試真題28
1.4 內(nèi)容提供者30
1.4.1 系統(tǒng)ContentProvider31
1.4.2 自定義ContentProvider31
1.4.3 常見(jiàn)面試筆試真題32
第2章 布局及其常用屬性36
2.1 常用的幾種布局36
2.1.1 線性布局36
2.1.2 幀布局37
2.1.3 相對(duì)布局37
2.1.4 約束布局38
2.2 常見(jiàn)面試筆試真題40
第3章 自定義View及ViewGroup42
3.1 自定義View42
3.1.1 onMeasure()43
3.1.2 onDraw()44
3.2 自定義ViewGroup45
3.3 常見(jiàn)面試筆試真題48
第4章 動(dòng)畫(huà)65
4.1 View動(dòng)畫(huà)65
4.1.1 透明度動(dòng)畫(huà)(AlphaAnimation)65
4.1.2 縮放動(dòng)畫(huà)(ScaleAnimation)66
4.1.3 平移動(dòng)畫(huà)(TranslateAnimation)67
4.1.4 旋轉(zhuǎn)動(dòng)畫(huà)(RotateAnimation)68
4.1.5 AnimationSet69
4.2 屬性動(dòng)畫(huà)70
4.3 常見(jiàn)面試筆試真題74
第5章 數(shù)據(jù)庫(kù)框架83
5.1 文件流83
5.2 SQLite85
5.2.1 創(chuàng)建與更新數(shù)據(jù)庫(kù)85
5.2.2 添加數(shù)據(jù)86
5.2.3 刪除數(shù)據(jù)87
5.2.4 修改數(shù)據(jù)87
5.2.5 查詢數(shù)據(jù)87
5.3 LitePal88
5.3.1 使用前準(zhǔn)備工作88
5.3.2 創(chuàng)建與升級(jí)數(shù)據(jù)庫(kù)89
5.3.3 添加數(shù)據(jù)91
5.3.4 修改數(shù)據(jù)91
5.3.5 刪除數(shù)據(jù)93
5.3.6 查詢數(shù)據(jù)93
5.4 常見(jiàn)面試筆試真題95
第6章 網(wǎng)絡(luò)框架104
6.1 關(guān)于HTTP/HTTPS的基礎(chǔ)知識(shí)104
6.1.1 HTTP請(qǐng)求方式104
6.1.2 HTTP報(bào)文104
6.1.3 首部(Header)105
6.1.4 HTTP緩存106
6.2 OkHttp108
6.2.1 Get請(qǐng)求108
6.2.2 Post請(qǐng)求109
6.2.3 文件上傳109
6.2.4 結(jié)合GSON框架來(lái)解析返回結(jié)果110
6.3 Retrofit112
6.4 常見(jiàn)面試筆試真題114
第7章 Rxjava119
7.1 Rxjava的優(yōu)點(diǎn)119
7.2 Rxjava原理119
7.3 Rxjava的使用120
7.4 操作符121
7.4.1 創(chuàng)建操作符121
7.4.2 轉(zhuǎn)換操作符124
7.4.3 組合操作符124
7.4.4 功能操作符127
7.4.5 過(guò)濾操作符135
7.4.6 條件操作符138
7.5 常見(jiàn)面試筆試真題140
第8章 事件分發(fā)機(jī)制142
8.1 觸摸事件的方法143
8.2 Activity事件分發(fā)143
8.3 ViewGroup與View事件分發(fā)144
8.4 常見(jiàn)面試筆試真題148
第9章 MVC、MVP與MVVM151
9.1 MVC151
9.2 MVP153
9.3 MVVM157
9.4 常見(jiàn)面試筆試真題158
第10章 圖片加載框架161
10.1 Glide161
10.2 ImageLoader162
10.3 Picasso162
10.4 常見(jiàn)面試筆試真題163
第11章 性能優(yōu)化與跨進(jìn)程通信165
11.1 性能優(yōu)化165
11.1.1 布局優(yōu)化165
11.1.2 繪制優(yōu)化167
11.1.3 內(nèi)存優(yōu)化168
11.1.4 包優(yōu)化169
11.1.5 Bitmap優(yōu)化169
11.2 跨進(jìn)程通信170
11.2.1 進(jìn)程與線程170
11.2.2 Android的IPC170
11.3 常見(jiàn)面試筆試真題172
第12章 Java基礎(chǔ)知識(shí)175
12.1 基本概念175
12.1.1 Java語(yǔ)言有哪些優(yōu)點(diǎn)?175
12.1.2 Java與C/C++有何異同?175
12.1.3 為什么需要public static void main(String[] args)這個(gè)方法?176
12.1.4 如何實(shí)現(xiàn)在main函數(shù)執(zhí)行前輸出“Hello world”?178
12.1.5 Java程序初始化的順序是怎樣的?178
12.1.6 Java中作用域有哪些?180
12.1.7 一個(gè)Java文件中是否可以定義多個(gè)類?181
12.1.8 什么是構(gòu)造方法?181
12.1.9 為什么Java中有些接口沒(méi)有聲明任何方法?183
12.1.10 Java中clone方法有什么作用?185
12.1.11 反射190
12.1.12 package有什么作用?194
12.1.13 Java如何實(shí)現(xiàn)類似于C語(yǔ)言中函數(shù)指針的功能?194
12.1.14 本地變量類型推斷196
12.1.15 常見(jiàn)面試筆試真題200
12.2 面向?qū)ο蠹夹g(shù)202
12.2.1 面向?qū)ο笈c面向過(guò)程有什么區(qū)別?202
12.2.2 面向?qū)ο笥心男┨卣鳎?03
12.2.3 面向?qū)ο蟮拈_(kāi)發(fā)方式有什么優(yōu)點(diǎn)?203
12.2.4 什么是繼承?204
12.2.5 組合與繼承有什么區(qū)別?204
12.2.6 多態(tài)的實(shí)現(xiàn)機(jī)制是什么?205
12.2.7 Overload和Override有什么區(qū)別?207
12.2.8 abstract class(抽象類)與interface(接口)有何異同?207
12.2.9 內(nèi)部類有哪些?209
12.2.10 如何獲取父類的類名?211
12.2.11 this與super有什么區(qū)別?212
12.2.12 常見(jiàn)面試筆試真題213
12.3 關(guān)鍵字216
12.3.1 變量命名有哪些規(guī)則?216
12.3.2 break、continue以及return的區(qū)別是什么?216
12.3.3 final、finally和 finalize有什么區(qū)別?218
12.3.4 assert有什么作用?220
12.3.5 static關(guān)鍵字有哪些作用?220
12.3.6 switch使用時(shí)有哪些注意事項(xiàng)?224
12.3.7 volatile有什么作用?226
12.3.8 instanceof有什么作用?230
12.3.9 strictfp有什么作用?230
12.3.10 常見(jiàn)面試筆試真題231
12.4 基本類型與運(yùn)算231
12.4.1 Java提供了哪些基本的數(shù)據(jù)類型?231
12.4.2 什么是不可變類?233
12.4.3