1. 程式人生 > 實用技巧 >2020Android開發者學習路線(快速篇),循序漸進基礎——高階,書籍+文件+大廠面試真題+思維導圖!

2020Android開發者學習路線(快速篇),循序漸進基礎——高階,書籍+文件+大廠面試真題+思維導圖!

一、Android大廠面試題

今日頭條(一面)

頭條是我第一家面試的公司,準備的不夠好,問的問題很全面,回答的有點僵,最後給拒了T_T

  • Activity正常和異常情況下的生命週期

  • Activity的四種啟動模式

  • app如何保證後臺服務不被殺死

  • IntentService比Service好在哪

  • 如何優雅的展示Bitmap大圖

  • Retrofit使用的註解是哪種註解?以及,註解的底層實現是怎樣的

  • Thread和HandlerThread區別

  • 關於< include >< merge >< stub >三者的使用場景

  • Java是值傳遞還是引用傳遞

  • final和static關鍵字的區別

  • HashSet和HashMap的區別

  • 深拷貝和淺拷貝的區別

  • clone()的預設實現是深拷貝還是淺拷貝?如何讓clone()實現深拷貝?

  • 動態代理和靜態代理

  • 演算法題:求二叉樹第n層節點數

  • JVM的記憶體分佈及垃圾回收機制


騰訊SNG(一二面)

  • 一面很簡單,二面問的特別深,而且面試官好凶Orz

  • 對Android訊息機制的理解

  • Java有哪幾種建立新執行緒的方法及區別

  • static修飾的方法可以被子類重寫嗎?為什麼?

  • 如何優化一個ListView?

  • 哪些情況會導致OOM?

  • 如何監測記憶體洩露?有哪些工具?

  • 用leak工具監測記憶體洩露的原理是什麼?

小米(一二面)

一面問的很詳細,二面也很深入,面試官態度也超好~

  • ThreadLocal的理解

  • HashMap HashSet HashTable的區別?

  • 如何讓HashMap可以執行緒安全?

  • Android對HashMap做了優化後推出的新的容器類是什麼?

  • Java多執行緒之間如何通訊

  • 執行緒池的實現機制

  • RxJava中map和flatmap操作符的區別及底層實現

  • 對訊息機制中Looper的理解)

  • Integer類對int的優化

  • 單例模式有哪些實現方式

  • 通過靜態內部類實現單例模式有哪些優點

  • synchronized volatile關鍵字有什麼區別?以及還有哪些同樣功能的關鍵字

  • 演算法題:兩個有序連結串列合併

  • 介面卡頓的原因有哪些?

  • 造成OOM/ANR 的原因?

  • Activity與Fragment生命週期有何聯絡

  • Activity與Fragment之間如何進行通訊?

  • RecyclerView與ListView快取機制的不同

阿里​

  • 作業系統程序間通訊有哪些方法

  • 談談對Socket的理解

  • 不同架構的機器有何不同(如x86等)

  • TCP/UDP比較

  • 什麼時候會發生死鎖

  • 作業系統層面上,執行緒可以加哪些鎖

  • 演算法題:求無序陣列中的中位數

  • 二叉樹深度演算法

  • android什麼情況下會發生記憶體洩露

  • 棧在系統中的方向是怎樣的?為什麼?

二、 JAVA部分總結

我覺得JAVA部分大致上可以分為這幾大塊,細想一套程式碼,其實就是類和組合這些類,怎麼組合其實就是設計模式。而類裡面包含的其實就是基本資料型別和一些資料機構來存放這些基本資料型別或者類,然後就是JVM去怎麼載入這些類。針對上面幾個部分我推薦幾本書吧:

《JAVA程式設計思想》
《深入理解JAVA虛擬機器 第二版》
《大話設計模式》
《HeadFirst設計模式》
《資料結構和演算法》
《圖解HTTP》

在這由於文字很多,我總結了Android面試所涉及到的常問範圍及常問面試題免費分享給大家,文末有領取!

三 、Android相關

Android部分我就不分幾大塊了。直接列舉,但是列舉到的每一項都是面試經常會問到並且會延伸問的,所以需要深入的去研究。

1.四大元件有哪些,說出你對他們在Android系統中的作用和理解。
2.Activity生命週期,A啟動B兩個頁面生命週期怎麼執行的,為什麼會 這樣,生命週期為什麼這麼設計,你有了解過嗎。
3.四種啟動模式,內部堆疊是怎麼回事,你工作中怎麼使用的。
4.Activity的啟動過程,這個我強烈建議每個Android開發人員都要清楚的知道,並且跟一下原始碼,幾個核心類的作用。你會對Android有一個更好的認識。
5.事件分發流程,怎麼處理滑動衝突。舉例:長按ListView的一個Item它變灰了。這個時候在滑動。item恢復原來的樣子,這個時候他們內部的事件傳遞是什麼樣子。有很多種問法,所以你一定要搞清楚。
6.自定義View,View的繪製流程。onMeasure,onLayout,onDraw都是什麼作用。ViewGroup是怎麼分發繪製的。onDraw裡面怎麼去做繪製,Canvas,Path,Paint你都需要了解。並且配合ValueAnimtor或者Scroller去實現動畫。有時候面試的會突發奇想問你ViewGroup是樹形結構,我想知道樹的深度,你怎麼計算,突然就變成了一個數據結構和演算法的題。
7.Bitmap和Drawable
8.Animation和Animator
9.LinearLayout、RelativeLayout、FrameLayout三種常用佈局的特性,他在佈局的時候是怎麼計算的。效率如何。CoordinatorLayout配合AppbarLayout的使用,以及自定義Behavior。ConstraintLayout的使用。用來減少層級。
10.Handler訊息機制,推薦看一下Looper的原始碼
11.程序間通訊,Binder機制
12.AsyncTask原始碼看一下。
13.圖片的壓縮處理,三級快取,Lru演算法
14.解析度和螢幕密度,以及計算一個圖片大小。mdpi,hdpi的關係和比例。
15.優化,記憶體優化,佈局優化,啟動優化,效能優化。記憶體洩露,記憶體溢位。怎麼優化,用了什麼工具,具體怎麼做的。
16.listView和RecycleView對比,以及快取策略。
17.JNI(很少問)
18.MVC,MVP,MVVM
19.開源框架Okhttp,Glide,EventBus,Rxjava等,以及JetPack下的開源庫,要會用,還說說出一些東西,推薦 Retrofit,Okhttp,Glide,EventBus這些看一下原始碼。
20.RecyclerView四大塊,能實現什麼效果,大致怎麼實現的,心裡要有數
21.DecorView,Window,WindowManager,PhoneWindow關係,以及個子的職責。
加分項:Kotlin,Gradle,Flutter,元件化,外掛化,熱修復。

四、 Android相關總結

上面的列的相關內容,看似很短一句話,但是每一項都需要你深入的去研究,要了解原理,最好去看一下原始碼實現。當然還有一些是我沒寫到的,可能是我寫的時候沒有想起來,並不代表他們不重要,你也需要重視,再來一波推薦:

《Android開發藝術探索》強烈推薦,建議細細的讀,如果粗心大意建議讀兩到三遍,針對性的讀。
《Android進階之光》
《高階Android開發強化實戰》
《Android元件化架構》
《Android熱修復技術原理》
《Android外掛化開發指南》

網路框架有哪些?他們之間的區別是什麼?(這個也會問到)
Xutils

這個框架非常全面,可以進行網路請求,可以進行圖片載入處理,可以資料儲存,還可以對view進行註解,使用這個框架非常方便,但是缺點也是非常明顯的,使用這個專案,會導致專案對這個框架依賴非常的嚴重,一旦這個框架出現問題,那麼對專案來說影響非常大的

OKhttp

Android開發中是可以直接使用現成的api進行網路請求的。就是使用HttpClient,HttpUrlConnection進行操作。okhttp針對Java和Android程式,封裝的一個高效能的http請求庫,支援同步,非同步,而且okhttp又封裝了執行緒池,封裝了資料轉換,封裝了引數的使用,錯誤處理等。API使用起來更加的方便。但是我們在專案中使用的時候仍然需要自己在做一層封裝,這樣才能使用的更加的順手。

Volley

Volley是Google官方出的一套小而巧的非同步請求庫,該框架封裝的擴充套件性很強,支援HttpClient、HttpUrlConnection, 甚至支援OkHttp,而且Volley裡面也封裝了ImageLoader,所以如果你願意你甚至不需要使用圖片載入框架,不過這塊功能沒有一些專門的圖片載入框架強大,對於簡單的需求可以使用,稍複雜點的需求還是需要用到專門的圖片載入框架。Volley也有缺陷,比如不支援post大資料,所以不適合上傳檔案。不過Volley設計的初衷本身也就是為頻繁的、資料量小的網路請求而生。

Retrofit

Retrofit是Square公司出品的預設基於OkHttp封裝的一套RESTful網路請求框架,RESTful是目前流行的一套api設計的風格, 並不是標準。Retrofit的封裝可以說是很強大,裡面涉及到一堆的設計模式,可以通過註解直接配置請求,可以使用不同的http客戶端,雖然預設是用http ,可以使用不同Json Converter 來序列化資料,同時提供對RxJava的支援,使用Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。

Volley VS OkHttp

Volley的優勢在於封裝的更好,而使用OkHttp你需要有足夠的能力再進行一次封裝。而OkHttp的優勢在於效能更高,因為 OkHttp基於NIO和Okio ,所以效能上要比 Volley更快。IO 和 NIO這兩個都是Java中的概念,如果我從硬碟讀取資料,第一種方式就是程式一直等,資料讀完後才能繼續操作這種是最簡單的也叫阻塞式IO,還有一種是你讀你的,程式接著往下執行,等資料處理完你再來通知我,然後再處理回撥。而第二種就是 NIO 的方式,非阻塞式, 所以NIO當然要比IO的效能要好了,而 Okio是 Square 公司基於IO和NIO基礎上做的一個更簡單、高效處理資料流的一個庫。理論上如果Volley和OkHttp對比的話,更傾向於使用 Volley,因為Volley內部同樣支援使用OkHttp,這點OkHttp的效能優勢就沒了, 而且 Volley 本身封裝的也更易用,擴充套件性更好些。

OkHttp VS Retrofit

毫無疑問,Retrofit 預設是基於 OkHttp 而做的封裝,這點來說沒有可比性,肯定首選 Retrofit。

Volley VS Retrofit

這兩個庫都做了不錯的封裝,但Retrofit解耦的更徹底,尤其Retrofit2.0出來,Jake對之前1.0設計不合理的地方做了大量重構, 職責更細分,而且Retrofit預設使用OkHttp,效能上也要比Volley佔優勢,再有如果你的專案如果採用了RxJava ,那更該使用 Retrofit 。所以這兩個庫相比,Retrofit更有優勢,在能掌握兩個框架的前提下該優先使用 Retrofit。但是Retrofit門檻要比Volley稍高些,要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對它一知半解,那還是建議在商業專案使用Volley吧。

18.熟悉哪些設計模式?

按照自己的實際情況回答,當然是越多越好。比如我自己也就熟悉個單例模式。

19.三級快取(這個偶爾會問)

網路載入,不優先載入,速度慢,浪費流量
本地快取,次優先載入,速度快
記憶體快取,優先載入,速度最快

首次載入Android App時,肯定要通過網路互動來獲取圖片,之後我們可以將圖片儲存至本地SD卡和記憶體中,之後執行APP時,優先訪問記憶體中的圖片快取,若記憶體中沒有,則載入本地SD卡中圖片,最後選擇訪問網路
Android與伺服器互動的方式中的對稱加密和非對稱加密是什麼?
對稱加密,就是加密和解密資料都是使用同一個key,這方面的演算法有DES。
非對稱加密,加密和解密是使用不同的key。傳送資料之前要先和服務端約定生成公鑰和私鑰,使用公鑰加密的資料可以用私鑰解密,反之。這方面的演算法有RSA。ssh 和 ssl都是典型的非對稱加密。

五、 面試心得

1.準備要充分,知識面要儘量的廣,同時深度也要夠。
2.面試安排上,如果不著急,儘量給自己留多時間,兩天一家,及時做總結和補充。
3.心態要放平,當做一次技術交流,面試要看一部分的運氣,也要看一些眼緣,有的面試官一張嘴你就能感覺到你這次面試完了。想去的公司沒有面試好,不要氣餒,繼續加油準備。
4.簡歷投遞方面,拉勾上投了很多經常不匹配,可能是我學歷問題(自考本),有一些打擊自信心,如果有同樣感受的,不妨換BOSS或者其他平臺。避免打擊自信心。
5.寫簡歷一定要體現自己的優勢,最好能體現類似於,用到了什麼技術,解決了什麼問題。簡歷上寫到的一定要胸有成竹。
6.類似於你的優勢是什麼,你覺得你專案中做的比較好的地方有哪些,你能給公司帶來什麼,這種問題心裡要先想一些,免得臨場發揮容易緊張說不好。
7.我所經歷的面試,一般技術面最少是兩輪。如果一輪後讓你走了,而你還自我感覺良好,那我覺得你有必要回顧一下面試內容,並一條一條找找該問題的相關內容,大部分問題就在於你沒有答到點子上,可能是深度不夠,也可能是擴充套件不夠。繼續加油。

六 、閒聊

現在外面面試問的的確比較多,要求也挺高的,行情不好,薪資也不好要,所以心態一定要放好,找好自己的定位,心態一定要好。

面試之後要儘量做到總結,從我最開始沒什麼準備就出去面試,被打擊一通之後,總結了七八家面試題,會發新面試問到的都是那些知識點,可能角度不一樣,但是你只要深度夠,他怎麼問,你基於原理來回答,基本上都沒差,從簽了賠償協議以後出來面試,連續四家公司都走到了HR面,可以說面試的感覺上來了。前面的總結積累終究沒有白費。

在寫這篇文章之前,我專門看了下我之前收藏的別的公號上發的面試題,很全,我都有點不想寫這篇文章了。但是想了下我這三個月聽到要裁員開始面試,到第一批沒被裁,第二批裁員遲遲不來。到第二批來的時候主動申請被裁。中間面試被打擊,失落,看到新聞那那都在裁員,到現在面試整體感覺還不錯。還是想分享一下自己的心裡路程,想告訴大家,裁員別慌,做自己該做的,其他自己決定不了的,先放一放,心裡列一個123,一條一條來。

可以看到我在上面推薦了很多書籍,而且JAVA部分時分塊來了。是因為當我看到很多面試題,針對題來的時候,題會很多,而且有時候你會覺得你的題都會了,但是面試的時候還是面不好,說明你的知識並不紮實。或者你知識會了這個題,並沒有融會貫通,所以在JAVA部分我分大塊來描述,而且針對每一塊,我都有推薦一本相關的書,你可能不需要都看,可以針對性的看。而Android部分時詳細的知識點,這些知識點我希望的是,能夠深入研究。而推薦的書籍,書中的部分都有一些相關的知識點,大家也可以選擇性的看,當然論壇,部落格都是知識的來源,大家做好知識點深度和廣度的基類就行了。

最後,雖然裁員的很多,都在說Android要沒落,但是,不要慌,做自己的計劃,學自己的習,競爭無處不在,每個行業都是如此。

答應大家的福利

進階學習視訊

image

附上:我們之前因為秋招收集的二十套一二線網際網路公司Android面試真題(含BAT、小米、華為、美團、滴滴)和我自己整理Android複習筆記(包含Android基礎知識點、Android擴充套件知識點、Android原始碼解析、設計模式彙總、Gradle知識點、常見演算法題彙總。)

本文在開源專案:【GitHub】中已收錄,裡面包含不同方向的自學程式設計路線、面試題集合/面經、及系列技術文章等,資源持續更新中…