進日逛知乎時,發現這樣一個話題:“你遇到過哪些高質量的Android面試?”
從上圖可以看出關注和瀏覽人數還是挺高的,但是看到提問時間是在3年前,爲什麼3年後的今天還能掀起熱浪呢?
想着這個問題,我就把問答完整的閱讀了一遍。想了提問時間,又想到了我收到的推送時間。才明白原來快到了“年後春招在即”,大部分的程序員都在躍躍欲試,所以三年前的問答就再度掀起熱浪。
想想我在互聯網行業已經吃了三年的青春飯,這幾年面試過的大廠不少於十家。拿到了offer也有3家,其中包含了小米、網易、還有一個新浪,現在在字節跳動划水摸魚,有機會一起哈!我拿到手的offer的平均水平都在24K——27K 左右(工作1—2年),藉着問答的機會作一波面試覆盤。
一、小米(2019.4.17)
1、介紹項目
我之前是做了新聞App,相當於低仿的今日頭條吧!
基本功能:
歡迎頁面加載(3s,點擊可跳過)——Activity相關
用戶註冊/登錄 ——SQLite運用
橫向滑動列表顯示新聞類別——TabLayout、ViewPager、FragmentPagerAdapter的應用
底部菜單欄 切換——Fragment運用
主頁(顯示新聞列表)——ListView
設置(退出應用、退出登錄、清空緩存)——Activity管理、SharePreference
我的(賬號安全、新聞收藏夾)——SQLite
新聞列表下拉、上滑實現刷新——自定義ListView
逐條收藏新聞、刪除新聞——SharePreference
仿UI界面——各類控件運用
點擊查看新聞詳情 —— WebView
用戶界面更換頭像功能——Android運行時權限、多媒體、Content Provide
2、簡單說一下Activity生命週期?
下圖是Activity狀態轉換圖(注意圖中,方框內執行的是狀態轉換的過程,並不是狀態,狀態如前述,只有三種:RUNNING / PAUSED / STOPPED。)
3、簡述一下RecyclerView緩存機制?
RecyclerView在Android的應用上可以說已經取代了listview,其靈活,組裝式設置,多緩存機制可以適應多列表在Android開發中各種各樣的需求。
對於RecyclerView的緩存機制一直都想稍微的屢下思路,簡單點說RecyclerView對比listview緩存機制中就是多了兩層緩存的支持,listview是兩級緩存,RecyclerView爲四級緩存(當然在大部分情況下是三級緩存)。
4、在一個listview裏每個item中都有一個動畫(gif)播放的view,當我點擊item中的button時動畫(gif)播放。當有動畫播放時滑動listview,偶爾會發生item錯位的事件。原因是什麼?
這是item複用的問題,由於異步加載導致圖片錯位
5、當Activity有多個Handler的時候,Message消息是否會混亂?怎麼樣區分當前消息由哪個Handler處理?
不會混亂,哪個Handler發送的消息,到時候也是這個handler處理。在發送消息的時候,會綁定target,這個target就是Handler本身,當需要handler調用dispatchMessage(msg)處理消息的時候,這個Handler就是發送消息時綁定的handler。
無論用哪一種方法發送消息,最終都會調用enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)來發送消息
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
這裏的this,就是當前的handler。在來看需要Handler處理消息的時候,取的是哪一個handler,下面貼出主要源碼。
public static void loop() {
......
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
// This must be in a local variable, in case a UI event sets the logger
......
if (traceTag != 0 && Trace.isTagEnabled(traceTag)) {
Trace.traceBegin(traceTag, msg.target.getTraceName(msg));
}
final long dispatchStart = needStartTime ? SystemClock.uptimeMillis() : 0;
final long dispatchEnd;
try {
msg.target.dispatchMessage(msg);
dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
......
msg.recycleUnchecked();
}
}
這是循環消息時的部分代碼,處理消息代碼是msg.target.dispatchMessage(msg);,這裏的target就是當時發送消息的handler。
二、網易(2020.5.2面試)
1、介紹項目
剛剛說了,不多介紹
2、說一下你對Java中強引用、弱引用、軟引用的理解
強引用:這種引用就是我們在平常頻繁使用的引用類型,JVM默認的就是這種引用類型的,例如,A a = new A(),這種就是強引用;
在這種類型下,當內存空間不足的時候,JVM寧可會OOM,使得程序異常中止退出,也不會隨意的對其進行回收,只有當此對象沒有引用的時候,JVM纔會回收他。
軟引用:這種引用我們可以這樣使用它,SoftReference sr = new SoftReference(new A());可以利用sr.get()獲取到這個對象,這種引用類型的對象,如果JVM內存足夠的話就不會回收他;如果JVM內存不足了,纔會回收這些對象。這種引用類型適合用作緩存來使用。
弱引用:這種引用可以這用使用他,WeakReference<A> wr = new WeakReference<A>(new A());然後利用wr.get()獲取到這個對象;這種引用類型的對象,比軟引用的對象,擁有更加短暫的生命週期,在垃圾收集器掃描JVM的內存區域的時候,遇到此種引用類型的對象的時候,不管當前內存是否夠用,都會回收這些對象。
3、死鎖是什麼?必要條件是什麼?怎麼避免?
死鎖是指多個進程循環等待它方佔有的資源而無限期僵持下去的局面。當兩個或兩個以上的進程同時對多個互斥資源提出使用要求時,有可能導致死鎖。
互斥條件:即一次只有一個進程可以使用資源,其它進程不能訪問已經分配給其它進程的資源
佔有且等待:一個進程等待其它進程釋放資源的時候,它已知佔有這個資源
不可搶佔:其它進程不能強行佔用已經分配給進程的資源
循環等待:存在一個閉合鏈,鏈中的進程至少佔據鏈中下一個進程的所需的一個資源
死鎖避免:
預防互斥:不可能禁止
預防佔有且等待:讓進程一次性申請完所有的資源。
預防不可搶佔:(1)當佔有資源的進程進一步申請資源的時候,拒絕,然後強制釋放當前佔用的資源。必要時可再申請。(2)當一個進程請求被另外一個進程所佔據的資源的時候,操作系統可以搶佔這個佔據資源的進程。要求釋放資源。第二種方案只有在任意兩個進程優先級不同的情況下.
預防循環等待:定義資源訪問線性序列
4、TCP與UDP的區別
基於連接與無連接。
TCP要求系統資源較多,UDP較少。
UDP程序結構較簡單。
流模式(TCP)與數據報模式(UDP)。
TCP保證數據正確性,UDP可能丟包。
5、算法題:給定一個非空字符串 s 和一個包含非空單詞列表的字典wordDict,判定 s 是否可以被空格拆分爲一個或多個在字典中出現的單詞。
答案解析:給定一個非空字符串 s 和一個包含非空單詞列表的字典wordDict,判定 s 是否可以被空格拆分爲一個或多個在字典中出現的單詞答案解析
Android
1、自定義View需要重寫那些方法?
(結合實際需求,需要滑動則重寫onTouchEvent,需要控制自身佈局則重寫onMeasure,onLayout)
2、如何進行佈局優化呢?
答案解析:佈局優化_qq_39477770的博客-CSDN博客
3、Handler消息機制
答案解析:Android Handler消息機制原理最全解讀(持續補充中)
4、說說你對UI優化的理解
三、新浪(2020.12.21)
1、介紹項目
剛剛說了,不多介紹
2、有沒有了解過插件化?插件化和組件化什麼區別?
答案解析:模塊化、組件化和插件化的區別
3、什麼時候用Application的Context,什麼時候用Activity的Context
答案解析:什麼時候用Application的Context,什麼時候用Activity的Context_lulinhua1010
4、一定要在主線程中更新UI嗎?能不能在子線程更新?
5、kotlin是如何兼容Java的?
覆盤了這麼多,其實細心的朋友可以發現,大廠面試對Java基礎、Android基礎還是比較看重的,所以在面試前,進行一波知識的梳理是很有必要的。
1、Java基礎面試考察點
JVM 工作流程
運行時數據區(Runtime Data Area)
類加載器
垃圾回收 GC
String、StringBuffer、StringBuilder
接口
HashMap
單例模式
線程的屬性、狀態、狀態控制
synchronized
volatile
2、Android基礎面試考察點
Activity:生命週期、啓動模式、啓動過程
Fragment:特點、生命週期、與 Activity 通信
Service:啓動過程、綁定過程、生命週期、啓用前臺服務(註冊過程)、BroadcastReceiver、ContentProvider、數據存儲
View:MeasureSpec、MotionEvent、VelocityTracker、GestureDetector、View的滑動、Scroller、事件分發、自定義View、Draw的基本流程
進程:進程的生命週期、多進程、OOM_ADJ
Parcelable接口:Parcelable與Serializable對比
IPC:IPC方式、Binder、AIDL通信、Messenger
Bitmap:常用操作裁剪、縮放、旋轉、移動、Bitmap與Drawabl、轉換、保存與釋放、圖片壓縮、BitmapFactory、Bitmap創建流程、Option類
屏幕適配:(頭條、抖音)適配方案、劉海屏適配
消息機制:Handler機制、工作原理(ThreadLocal、MessageQueue、Looper、Handler)
線程異步:AsyncTask、HandlerThread、IntentService、線程池、RecyclerView優化
Webview:WebView、WebSetings、WebViewClient、WebChromeClient、Webview加載優化、內存泄漏
3、Android延伸知識考查點
ART:AOT編譯、垃圾優先回收、開發調試調優、GC
Apk包體優化:Apk結構組成、整體優化、資源優化、代碼優化、.arsc文件優化、lib目錄優化
Proguard:公共模板、自定義混淆原則
架構模式:MVC、MVP、MVVM
Jetpack:架構模式
NDK開發:JNI基礎(數據類型、String字符串函數操作、訪問Java的通常方法)、基礎開發原則、Cmake構建NDK項目、常用的Android NDK原生API
4、計算機網絡面試考察點
Http相關:請求報文與響應、報文緩存機制、HttpsHttp 2.0
TCP/IP:三次握手四次揮手、TCP與UDP的區別
Socket:使用示例
類加載器:雙親委託模式、DexPathList
因文檔有1200頁,內容過於繁多。還有一些設計模式、源碼、算法面試題,就不一一介紹了。
近期,年後想要跳槽的朋友,需要這份Android面試考察點彙總PDF可以去我【GitHub】上查看:https://github.com/733gh/Android-T3