這些Android面試題你還會做嗎?

最近在給公司招聘3年以下經驗的android開發人員,趁這個機會整理下一些基本的面試題,不是很多,我個人覺得比較典型的,時間長了一些不常用的細節問題都快忘記了,也許是輪子用多了吧,如果能在趕專案進度的時候抽出時間,總結回顧下一些知識,也是很不錯的,沒事的時候自己寫寫輪子,會有意想不到的收穫。 招聘資訊發出去很久了,居然沒收到幾份簡歷,當然薪資在行業內是具有競爭力的,我很詫異,難道現在行情這麼好,都不缺工作嗎?還是行情不好入行做android的少了?導致3年以下的開發人員逐漸減少,所以我發起投票,想分析下,看看 都是幾年的大神啊,總結完了會跟大家分享,謝謝參與!嘿嘿,有什麼想法歡迎在留言區留言
下邊是面試題:
1、導致記憶體洩露的原因有哪些?
記憶體洩露的根本原因:長生命週期的物件持有短生命週期的物件。短週期物件就無法及時釋放。
靜態內部類非靜態內部類的區別(Handler 引起的記憶體洩漏。)
靜態集合類引起記憶體洩露
單例模式引起的記憶體洩漏。
解決:Context是ApplicationContext,由於ApplicationContext的生命週期是和app一致的,不會導致記憶體洩漏
註冊/反註冊未成對使用引起的記憶體洩漏。
集合物件沒有及時清理引起的記憶體洩漏。通常會把一些物件裝入到集合中,當不使用的時候一定要記得及時清理集合,讓相關物件不再被引用。
記憶體分析工具的使用
減少記憶體物件的佔用
I.ArrayMap/SparseArray代替hashmap
II.避免在android裡面使用Enum
III.減少bitmap的記憶體佔用
inSampleSize:縮放比例,在把圖片載入記憶體之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。
decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。
IV.減少資源圖片的大小,過大的圖片可以考慮分段載入
2、理解Activity,View,Window三者關係
這個問題真的很不好回答。所以這裡先來個算是比較恰當的比喻來形容下它們的關係吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示檢視)LayoutInflater像剪刀,Xml配置像窗花圖紙。
1:Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。
2:這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根檢視。
3:“ViewRoot”通過addView方法來一個個的新增View。比如TextView,Button等
4:這些View的事件監聽,是由WindowManagerService來接受訊息,並且回撥Activity函式。比如onClickListener,onKeyDown等。
3、Handler的原理
所以就有了handler,它的作用就是實現執行緒之間的通訊。
handler整個流程中,主要有四個物件,handler,Message,MessageQueue,Looper。當應用建立的時候,就會在主執行緒中建立handler物件,
我們通過要傳送的訊息儲存到Message中,handler通過呼叫sendMessage方法將Message傳送到MessageQueue中,Looper物件就會不斷的呼叫loop()方法
不斷的從MessageQueue中取出Message交給handler進行處理。從而實現執行緒之間的通訊。
4、View,ViewGroup事件分發
1. Touch事件分發中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關事件。View包含dispatchTouchEvent、onTouchEvent兩個相關事件。其中ViewGroup又繼承於View。
2.ViewGroup和View組成了一個樹狀結構,根節點為Activity內部包含的一個ViwGroup。
3.觸控事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸控事件中,Down和Up都只有一個,Move有若干個,可以為0個。
4.當Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發。ViewGroup的遍歷可以看成是遞迴的。分發的目的是為了找到真正要處理本次完整觸控事件的View,這個View會在onTouchuEvent結果返回true。
5.當某個子View返回true時,會中止Down事件的分發,同時在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進行處理。由於子View是儲存在ViewGroup中的,多層ViewGroup的節點結構時,上級ViewGroup儲存的會是真實處理事件的View所在的ViewGroup物件:如ViewGroup0-ViewGroup1-TextView的結構中,TextView返回了true,它將被儲存在ViewGroup1中,而ViewGroup1也會返回true,被儲存在ViewGroup0中。當Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。
6.當ViewGroup中所有子View都不捕獲Down事件時,將觸發ViewGroup自身的onTouch事件。觸發的方式是呼叫super.dispatchTouchEvent函式,即父類View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發Acitivity的onTouchEvent方法。
7.onInterceptTouchEvent有兩個作用:1.攔截Down事件的分發。2.中止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup捕獲Up和Move事件。
5、onNewIntent()什麼時候呼叫?(singleTask)
6、mvc 和 mvp mvvm
· 1.mvc:資料、View、Activity,View將操作反饋給Activity,Activitiy去獲取資料,資料通過觀察者模式重新整理給View。迴圈依賴
1.Activity重,很難單元測試
2.View和Model耦合嚴重
· 2.mvp:資料、View、Presenter,View將操作給Presenter,Presenter去獲取資料,資料獲取好了返回給Presenter,Presenter去重新整理View。PV,PM雙向依賴
1.介面爆炸
2.Presenter很重
· 3.mvvm:資料、View、ViewModel,View將操作給ViewModel,ViewModel去獲取資料,資料和介面綁定了,資料更新介面更新。
1.viewModel的業務邏輯可以單獨拿來測試
2.一個view 對應一個 viewModel 業務邏輯可以分離,不會出現全能類
3.資料和介面綁定了,不用寫垃圾程式碼,但是複用起來不舒服
7、自定義控制元件
View的繪製流程:OnMeasure()——>OnLayout()——>OnDraw()
第一步:OnMeasure():測量檢視大小。從頂層父View到子View遞迴呼叫measure方法,measure方法又回撥OnMeasure。
第二步:OnLayout():確定View位置,進行頁面佈局。從頂層父View向子View的遞迴呼叫view.layout方法的過程,即父View根據上一步measure子View所得到的佈局大小和佈局引數,將子View放在合適的位置上。
第三步:OnDraw():繪製檢視。ViewRoot建立一個Canvas物件,然後呼叫OnDraw()。六個步驟:①、繪製檢視的背景;②、儲存畫布的圖層(Layer);③、繪製View的內容;④、繪製View子檢視,如果沒有就不用;
⑤、還原圖層(Layer);⑥、繪製滾動條。
8、Serializable和Parcelable 的區別
1.P 消耗記憶體小
2.網路傳輸用S 程式內使用P
3.S將資料持久化方便
4.S使用了反射 容易觸發垃圾回收 比較慢
結尾
有補充的歡迎留言,我會分享給大家!
根據上面面試的問題整理出了一份學習思維導讀,希望幫到大家學習,早日拿到大公司的offer。
Android進階

Android前沿技術

移動架構師


需要這些資料的大夥關注+點贊+加群:185873940 免費獲取!
群內還有許多免費的關於高階安卓學習資料,包括高階UI、效能優化、架構師課程、 NDK、混合式開發:ReactNative+Weex等多個Android技術知識的架構視訊資料,還有職業生涯規劃及面試指導