1. 程式人生 > 其它 >androidframework視訊,2021年Android開發者常見面試題,工作感悟

androidframework視訊,2021年Android開發者常見面試題,工作感悟

背景

隨著公司業務的發展,對業務團隊的敏捷性和創新性提出了更高的要求,而通過大資料的手段在一定程度上可以幫助我們實現這個願景,同時良好的資料分析可以也幫助我們進行更好更優的決策。對於資料本身,其處理流程主要可以歸結為以下幾點:

  • 資料採集
  • 資料上報
  • 資料儲存
  • 資料分析
  • 資料展示

其中所謂的資料採集是針對特定使用者行為或事件進行捕獲、處理,這一步驟無疑是十分重要的,因為資料採集的準確性和多樣性也會直接對後續的步驟產生影響。本文也主要是討論資料採集的幾種方式,而我們常說的『埋點』就是資料採集領域的術語,資料採集的方式也可以說是埋點的幾種方式。

一、準備

首先是準備簡歷,然後就是過一下面試題。

簡歷的編寫其實這裡可能需要注意幾點:

1.標題的直接按照姓名-幾年工作經驗-應聘崗位格式來填寫。例如 小明——四年工作經驗——Android開發高階工程師。因為要知道,HR篩選簡歷是非常快的,你要在第一時間就讓他看到他想要看的資訊。HR一開始最關心的就是工作年限和崗位,你直接在標題欄用最大的字型寫出來會比很多人介紹了半天專案最後寫年限要好得多。

2.個人資訊寫最前面。 個人資訊欄其實不用寫很多東西,最主要的就是姓名、聯絡方式、性別、如果學校是名校那麼就寫上,如果本科學的是計算機專業也可以在這裡寫上,如果都不是就最好放到最後去寫,因為最前面的東西永遠是最先看到的內容,也是你最有競爭力和賣弄的資本。

3.有技術部落格和github開源專案的一定寫在最前面。 這是活生生的例子。我在面試華為的時候面試官就特意去看了我的csdn上的部落格。然後說寫的還是不錯的,給他留下了一個不錯的印象,所以這點是絕對的加分項最好就是寫在最前面。

刷面試題這塊其實一開始我並沒有刷特別多,也就是簡單的看了下一些基礎性的知識點。因為我始終覺得看得越多越記不住,而且最重要的是你根本不知道面試官會怎麼問,與其盲目的看知識點倒不如先出去找幾家小公司面試找找感覺,知道面試官會針對哪些地方詢問,再回來針對性的看。

二、技能儲備

(一)Java

一、HashMap和Hashtable區別?

這個一定要去看原始碼!看原始碼!看原始碼!實在看不下去的可以上網看別人的分析。簡單總結有幾點:

1.HashMap支援null Key和null Value;Hashtable不允許。這是因為HashMap對null進行了特殊處理,將null的hashCode值定為了0,從而將其存放在雜湊表的第0個bucket。

2.HashMap是非執行緒安全,HashMap實現執行緒安全方法為Map map = Collections.synchronziedMap(new HashMap());Hashtable是執行緒安全

3.HashMap預設長度是16,擴容是原先的2倍;Hashtable預設長度是11,擴容是原先的2n+1

4.HashMap繼承AbstractMap;Hashtable繼承了Dictionary

擴充套件,HashMap 對比 ConcurrentHashMap ,HashMap 對比 SparseArray,LinkedArray對比ArrayList,ArrayList對比Vector

二、Java垃圾回收機制

需要理解JVM,記憶體劃分——方法區、記憶體堆、虛擬機器棧(執行緒私有)、本地方法棧(執行緒私有)、程式計數器(執行緒私有), 理解回收演算法——標記清除演算法、可達性分析演算法、標記-整理演算法、複製演算法、分代演算法,優缺點都理解下。

詳細的可以看看其他同學寫的 點選開啟連結

三、類載入機制

這個可以結合 熱修復 深入理解下。點選開啟連結

四、執行緒和執行緒池,併發,鎖等一系列問題

這個可以擴充套件下 如何自己實現一個執行緒池?

五、HandlerThread、IntentService理解

六、弱引用、軟引用區別

七、int、Integer有什麼區別

主要考值傳遞和引用傳遞問題

八、手寫生產者/消費者 模式

(二)Android 一、android啟動模式

需要了解下Activity棧和taskAffinity

1.Standard:系統預設,啟動一個就多一個Activity例項

2.SingleTop:棧頂複用,如果處於棧頂,則生命週期不走onCreate()和onStart(),會呼叫onNewIntent(),適合推送訊息詳情頁,比如新聞推送詳情Activity;

3.SingleTask:棧內複用,如果存在棧內,則在其上所有Activity全部出棧,使得其位於棧頂,生命週期和SingleTop一樣,app首頁基本是用這個

4.SingleInstance:這個是SingleTask加強本,系統會為要啟動的Activity單獨開一個棧,這個棧裡只有它,適用新開Activity和app能獨立開的,如系統鬧鐘,微信的視訊聊天介面不知道是不是,知道的同學告訴我下,在此謝過!

另外,SingleTask和SingleInstance好像會影響到onActivityResult的回撥,具體問題大家搜下,我就不詳說。

Intent也需要進一步瞭解,Action、Data、Category各自的用法和作用,還有常用的

Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_CLEAR_TOP

等等,具體看下原始碼吧。

二、View的繪製流程

ViewRoot -> performTraversal() -> performMeasure() -> performLayout() -> perfromDraw() -> View/ViewGroup measure() -> View/ViewGroup onMeasure() -> View/ViewGroup layout() -> View/ViewGroup onLayout() -> View/ViewGroup draw() -> View/ViewGroup onDraw() 看下invalidate方法,有帶4個引數的,和不帶引數有什麼區別;requestLayout觸發measure和layout,如何實現區域性重新測量,避免全域性重新測量問題。

三、事件分發機制

-> dispatchTouchEvent() -> onInterceptTouchEvent() -> onTouchEvent() requestDisallowInterceptTouchEvent(boolean) 還有onTouchEvent()、onTouchListener、onClickListener的先後順序

四、訊息分發機制

這個考得非常常見。一定要看原始碼,程式碼不多。帶著幾個問題去看:

1.為什麼一個執行緒只有一個Looper、只有一個MessageQueue?

2.如何獲取當前執行緒的Looper?是怎麼實現的?(理解ThreadLocal)

3.是不是任何執行緒都可以例項化Handler?有沒有什麼約束條件?

4.Looper.loop是一個死迴圈,拿不到需要處理的Message就會阻塞,那在UI執行緒中為什麼不會導致ANR?

5.Handler.sendMessageDelayed()怎麼實現延遲的?結合Looper.loop()迴圈中,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。

五、AsyncTask原始碼分析

優劣性分析,這個網上一大堆,不重述。

六、如何保證Service不被殺死?如何保證程序不被殺死?

這兩個問題我面試過程有3家公司問到。

七、Binder機制,程序通訊

Android用到的程序通訊底層基本都是Binder,AIDL、Messager、廣播、ContentProvider。不是很深入理解的,至少ADIL怎麼用,Messager怎麼用,可以寫寫看,另外序列化(Parcelable和Serilizable)需要做對比,這方面可以看看任玉剛大神的android藝術開發探索一書。

八、動態許可權適配問題、換膚實現原理

這方面看下鴻洋大神的博文吧

九、SharedPreference原理,能否跨程序?如何實現?

(三)效能優化問題 一、UI優化

a.合理選擇RelativeLayout、LinearLayout、FrameLayout,RelativeLayout會讓子View呼叫2次onMeasure,而且佈局相對複雜時,onMeasure相對比較複雜,效率比較低,LinearLayout在weight>0時也會讓子View呼叫2次onMeasure。LinearLayout weight測量分配原則。

b.使用標籤

c.減少佈局層級,可以通過手機開發者選項>GPU過渡繪製檢視,一般層級控制在4層以內,超過5層時需要考慮是否重新排版佈局。

d.自定義View時,重寫onDraw()方法,不要在該方法中新建物件,否則容易觸發GC,導致效能下降

e.使用ListView時需要複用contentView,並使用Holder減少findViewById載入View。

f.去除不必要背景,getWindow().setBackgroundDrawable(null)

g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView佈局

二、記憶體優化

主要為了避免OOM和頻繁觸發到GC導致效能下降

a.Bitmap.recycle(),Cursor.close,inputStream.close()

b.大量載入Bitmap時,根據View大小載入Bitmap,合理選擇inSampleSize,RGB_565編碼方式;使用LruCache快取

c.使用 靜態內部類+WeakReference 代替內部類,如Handler、執行緒、AsyncTask

d.使用執行緒池管理執行緒,避免執行緒的新建

e.使用單例持有Context,需要記得釋放,或者使用全域性上下文

f.靜態集合物件注意釋放

g.屬性動畫造成記憶體洩露

h.使用webView,在Activity.onDestory需要移除和銷燬,webView.removeAllViews()和webView.destory()

備:使用LeakCanary檢測記憶體洩露

三、響應速度優化

Activity如果5秒之內無法響應螢幕觸碰事件和鍵盤輸入事件,就會出現ANR,而BroadcastReceiver如果10秒之內還未執行操作也會出現ANR,Serve20秒會出現ANR 為了避免ANR,可以開啟子執行緒執行耗時操作,但是子執行緒不能更新UI,因此需要Handler訊息機制、AsyncTask、IntentService進行執行緒通訊。

備:出現ANR時,adb pull data/anr/tarces.txt 結合log分析

四、其他效能優化

a.常量使用static final修飾

b.使用SparseArray代替HashMap

c.使用執行緒池管理執行緒

d.ArrayList遍歷使用常規for迴圈,LinkedList使用foreach

e.不要過度使用列舉,列舉佔用記憶體空間比整型大

f.字串的拼接優先考慮StringBuilder和StringBuffer

g.資料庫儲存是採用批量插入+事務

(四)設計模式 1.單例模式:好幾種寫法,要求會手寫,分析優劣。一般雙重校驗鎖中用到volatile,需要分析volatile的原理

2.觀察者模式:要求會手寫,有些面試官會問你在專案中用到了嗎?實在沒有到的可以講一講EventBus,它用到的就是觀察者模式

3.介面卡模式:要求會手寫,有些公司會問和裝飾器模式、代理模式有什麼區別?

4.建造者模式+工廠模式:要求會手寫

5.策略模式:這個問得比較少,不過有些做電商的會問。

6.MVC、MVP、MVVM:比較異同,選擇一種你拿手的著重講就行

(五)資料結構 1.HashMap、LinkedHashMap、ConcurrentHashMap,在用法和原理上有什麼差異,很多公司會考HashMap原理,通過它做一些擴充套件,比如中國13億人口年齡的排序問題,年齡對應桶的個數,年齡相同和hash相同問題類似。

2.ArrayList和LinkedList對比,這個相對簡單一點。

3.平衡二叉樹、二叉查詢樹、紅黑樹,這幾個我也被考到。

4.Set原理,這個和HashMap考得有點類似,考hash演算法相關,被問到過常用hash演算法。HashSet內部用到了HashMap

(六)演算法 演算法主要考刷題吧,去LeetCode和牛客網刷下。

(七)原始碼理解 專案中多多少少會用到開源框架,很多公司都喜歡問原理和是否看過原始碼,比如網路框架Okhttp,這是最常用的,現在Retrofit+RxJava也很流行。

一、網路框架庫 Okhttp

okhttp原始碼一定要去看下,裡面幾個關鍵的類要記住,還有連線池,攔截器都需要理解。被問到如何給某些特定域名的url增加header,如果是自己封裝的程式碼,可以在封裝Request中可以解決,也可以增加攔截器,通過攔截器去做。

二、訊息通知 EventBus

1.EventBus原理:建議看下原始碼,不多。內部實現:觀察者模式+註解+反射

2.EventBus可否跨程序問題?代替EventBus的方法(RxBus)

三、圖片載入庫(Fresco、Glide、Picasso)

1.專案中選擇了哪個圖片載入庫?為什麼選擇它?其他庫不好嗎?這幾個庫的區別

2.專案中選擇圖片庫它的原理,如Glide(LruCache結合弱引用),那麼面試官會問LruCache原理,進而問LinkedHashMap原理,這樣一層一層地問,所以建議看到不懂的追進去看。如Fresco是用來MVC設計模式,5.0以下是用了共享記憶體,那共享記憶體怎麼用?Fresco怎麼實現圓角?Fresco怎麼配置快取?

四、訊息推送Push

1.專案中訊息推送是自己做的還是用了第三方?如極光。還有沒有用過其他的?這幾家有什麼優勢區別,基於什麼原因選擇它的?

2.訊息推送原理是什麼?如何實現心跳連線?

五、TCP/IP、Http/Https

網路這一塊如果簡歷中寫道熟悉TCP/IP協議,Http/Https協議,那麼肯定會被問道,我就驗證了。一般我會回答網路層關係、TCP和UDP的區別,TCP三次握手(一定要講清楚,SYN、ACK等標記怎樣的還有報文結構都需要熟悉下),四次揮手。為什麼要三次握手?DDoS攻擊。為什麼握手三次,揮手要四次?Http報文結構,一次網路請求的過程是怎樣的?Http和Https有什麼不同?SSL/TLS是怎麼進行加密握手的?證書怎麼校驗?對稱性加密演算法和非對稱加密演算法有哪些?挑一個熟悉的加密演算法簡單介紹下?DNS解析是怎樣的?

六、熱更新、熱修復、外掛化(這一塊要求高點,一般高階工程師是需要理解的)

瞭解classLoader

七、新技術

RxJava、RxBus、RxAndroid,這個在面試想去的公司時,可以反編譯下他們的包,看下是不是用到,如果用到了,面試過程難免會問道,如果沒有,也可以忽略,但學習心強的同學可以看下,比較是比較火的框架。

Retrofit,熟練okhttp的同學建議看下,聽說結合RxJava很爽。

最後

想要了解更多關於大廠面試的同學可以點選這裡免費獲取《面試文件》除此之外,我也分享一些免費的優質資源,包括:Android學習PDF+架構視訊+原始碼筆記高階架構技術進階腦圖、Android開發面試專題資料,高階進階架構資料 這幾塊的內容。分享給大家,非常適合近期有面試和想在技術道路上繼續精進的朋友。快來獲取學習資料吧~