搜尋
首頁web前端前端問答分享Android面試心得【精選】

推薦:《2020年Android面試題大總結【收藏】

從年前至今參加面試了很多公司,也收到了幾家巨頭的offer,還有其他公司的。總結下經驗,也是對過去的一個回顧與總結吧。

一、履歷

網路上有很多對程式設計師履歷的一些指導,這裡就不重述,大家可以搜下網路上其他大神的總結,結合自身狀況修改下。我有幾點建議:

1.盡量不要花哨,程式設計師和設計師或產品運作還不一樣,我們的履歷成功與否決定權還是在技術面試官那,而他們看重的是你的專案經驗內容和技術等描述。

2.技能描述這塊盡量只寫你懂得而且理解深刻的,可以適當加入一些新技術或流行框架,不過這塊需要理解,沒來得及看源碼的可以看看大神們對它的總結,網路上一大堆。

3.專案經驗這塊盡量加入關鍵字,例如使用了什麼技術、用到哪些設計模式、優化資料比較、擴充總結之類的。而非一味地介紹這個專案內容(那是產品經理的描述),例如性能優化這塊,分為UI性能優化、內存優化、數據庫優化、網絡優化、耗電優化等等。可以從1.如何發現問題,2.怎麼解決問題,3.解決效果對比,這幾個面向去描述。舉個簡單例子-UI優化,可以從UI出現什麼問題(卡頓不流暢),怎麼查找問題(手機開發者權限>GPU過度繪製發現層級問題,TraceView CPU使用情況分析),怎麼解決問題(降低層級、自訂View繪圖出現問題等),解決問題後效能再次比較。

二、技能儲備

(一)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 對比SparseArrayray ,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中可以解決,也可以增加攔截器,透過攔截器去做。

推薦一篇講解Okhttp不錯的文章

二、訊息通知 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很爽。

Kotlin

三、最後

履歷表首選內推方式,速度快,效率高啊!然後可以在拉鉤,boss,脈脈,街上看看。履歷寫道熟悉什麼技術就一定要去熟悉它,不然被問到不會很尷尬!做過什麼項目,即使項目體量不大,但也一定要熟悉實現原理!不是你負責的部分,也可以看看同事是怎麼實現的,換你來做你會怎麼做?做過什麼,會什麼是廣度問題,取決於專案內容。但做過什麼,達到怎樣一個境界,這是深度問題,和個人學習能力和解決問題的態度有關了。大公司看深度,小公司看廣度。大公司面試你會的,小公司面試他們用到的你會不會,也就是職位匹配度。

選定你想去的幾家公司後,先去一些小的公司練練,學習下面試技巧,總結下,也算是熟悉下面試氛圍,平時和同事或者產品PK時可以講得頭頭是道,思路清晰至極,到了現場真的不一樣,怎麼描述你所做的一切,這絕對是個學術性問題!

面試過程一定要有禮貌!即使你覺得面試官不尊重你,經常打斷你的講解,或者你覺得他不如你,問的問題缺乏專業水平,你也一定要尊重他,誰叫現在是他選擇你,等你拿到offer後就是你選擇他了。

另外,描述問題一定要慢!不要一下子講一大堆,慢顯得你沉穩、自信,而且你還有時間反應思路接下來怎麼講更好。現在開發過多依賴ide,所以會有個弊端,當我們在面試講解很容易不知道某個方法怎麼讀,這是一個硬傷......所以一定要對常見的關鍵性的類名、方法名、關鍵字讀準,有些面試官不耐煩會說「你到底說的是哪個?」這時我們會容易亂了陣腳。正確的發音 沉穩的描述 好聽的嗓音決對是一個加分項!

最重要的是心態!心態!心態!重要事情說三遍!面試時間很短,在短時間內對方要摸清你的底子還是比較不現實的,所以,有時也是看眼緣,這還是個看臉的時代。

希望大家都能找到適合自己滿意的工作! fighting!

以上是分享Android面試心得【精選】的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:jianshu。如有侵權,請聯絡admin@php.cn刪除
反應:創建動態和交互式用戶界面反應:創建動態和交互式用戶界面Apr 14, 2025 am 12:08 AM

React是構建動態和交互式用戶界面的首選工具。 1)組件化與JSX使UI拆分和復用變得簡單。 2)狀態管理通過useState鉤子實現,觸發UI更新。 3)事件處理機制響應用戶交互,提升用戶體驗。

React與後端框架:比較React與後端框架:比較Apr 13, 2025 am 12:06 AM

React是前端框架,用於構建用戶界面;後端框架用於構建服務器端應用程序。 React提供組件化和高效的UI更新,後端框架提供完整的後端服務解決方案。選擇技術棧時需考慮項目需求、團隊技能和可擴展性。

HTML和React:標記與組件之間的關係HTML和React:標記與組件之間的關係Apr 12, 2025 am 12:03 AM

HTML和React的關係是前端開發的核心,它們共同構建現代Web應用的用戶界面。 1)HTML定義內容結構和語義,React通過組件化構建動態界面。 2)React組件使用JSX語法嵌入HTML,實現智能渲染。 3)組件生命週期管理HTML渲染,根據狀態和屬性動態更新。 4)使用組件優化HTML結構,提高可維護性。 5)性能優化包括避免不必要渲染,使用key屬性,保持組件單一職責。

反應與前端:建立互動體驗反應與前端:建立互動體驗Apr 11, 2025 am 12:02 AM

React是構建交互式前端體驗的首選工具。 1)React通過組件化和虛擬DOM簡化UI開發。 2)組件分為函數組件和類組件,函數組件更簡潔,類組件提供更多生命週期方法。 3)React的工作原理依賴虛擬DOM和調和算法,提高性能。 4)狀態管理使用useState或this.state,生命週期方法如componentDidMount用於特定邏輯。 5)基本用法包括創建組件和管理狀態,高級用法涉及自定義鉤子和性能優化。 6)常見錯誤包括狀態更新不當和性能問題,調試技巧包括使用ReactDevTools和優

React和前端堆棧:工具和技術React和前端堆棧:工具和技術Apr 10, 2025 am 09:34 AM

React是一個用於構建用戶界面的JavaScript庫,其核心是組件化和狀態管理。 1)通過組件化和狀態管理簡化UI開發。 2)工作原理包括調和和渲染,優化可通過React.memo和useMemo實現。 3)基本用法是創建並渲染組件,高級用法包括使用Hooks和ContextAPI。 4)常見錯誤如狀態更新不當,可使用ReactDevTools調試。 5)性能優化包括使用React.memo、虛擬化列表和CodeSplitting,保持代碼可讀性和可維護性是最佳實踐。

React在HTML中的作用:增強用戶體驗React在HTML中的作用:增強用戶體驗Apr 09, 2025 am 12:11 AM

React通過JSX與HTML結合,提升用戶體驗。 1)JSX嵌入HTML,使開發更直觀。 2)虛擬DOM機制優化性能,減少DOM操作。 3)組件化管理UI,提高可維護性。 4)狀態管理和事件處理增強交互性。

REACT組件:在HTML中創建可重複使用的元素REACT組件:在HTML中創建可重複使用的元素Apr 08, 2025 pm 05:53 PM

React組件可以通過函數或類定義,封裝UI邏輯並通過props接受輸入數據。 1)定義組件:使用函數或類,返回React元素。 2)渲染組件:React調用render方法或執行函數組件。 3)復用組件:通過props傳遞數據,構建複雜UI。組件的生命週期方法允許在不同階段執行邏輯,提升開發效率和代碼可維護性。

反應嚴格模式目的反應嚴格模式目的Apr 02, 2025 pm 05:51 PM

React嚴格模式是一種開發工具,可通過激活其他檢查和警告來突出反應應用中的潛在問題。它有助於識別遺產代碼,不安全的生命週期和副作用,鼓勵現代反應實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。