1. 程式人生 > 其它 >做了5年Android,一線網際網路移動架構師設計思想解讀開源框架!幫你解決95%以上的問題!

做了5年Android,一線網際網路移動架構師設計思想解讀開源框架!幫你解決95%以上的問題!

起由

搞了7年多Android了,前陣子面試了一家不大不小的公司。公司不大,面試官架子還不小,一副目中無人高高在上的樣子,搞得好像我一萬個想進他們公司、我進不了他們公司我全家都得喝西北風一樣。搞得我是真的鬱悶:現在搞Android的找工作這麼卑微???

給大家分享一下我的面試經歷

一 Java相關

1.過載函式的簽名(區別是否是過載函式)
答:方法名+引數型別+引數順序(返回值不是)
2.finalize的工作原理
答:一旦垃圾收集器準備好釋放物件佔用的儲存空間,它首先呼叫finalize(),而且只有在下一次垃圾收集過程中,才會真正回收物件的記憶體.所以如果使用finalize(),就可以在垃圾收集期間進行一些重要的清除或清掃工作。此外系統進行垃圾回收時並不保證一定會呼叫它,所以可以說它和物件被回收沒有必然關係。
3.一個物件的建立過程


答:例如有一個Dog類:
?1.即使沒有static,構造器其實也是靜態方法,所以當首次建立Dog時或者Dog的靜態域或者靜態方法被訪問的時候,Dog的class物件會被載入。
?2.在載入Dog的class的時候可能會發現其有基類,此時先暫停Dog的載入,轉而去載入其基類。所以基類的static域比子類先初始化。
?3.載入class檔案之後,會建立一個該該類的class物件,所有關於靜態初始化的動作會被執行,所以靜態初始化只在Class物件首次載入時進行一次。
?4.當使用new的時候,首先為Dog物件在堆上分配足夠記憶體空間。這塊記憶體控制元件會被清零,所有例項都被初始化成了預設值,包括基類。
?5.執行所有欄位定義處的初始化,從基類開始。
?6.執行構造器。(在第一行會執行基類的構造器)
4.物件的銷燬是按照建立的逆序來進行的。

5.final的方法和類都不允許覆蓋和繼承。private預設實現了final。
6.簡述內部類的特點
7.形式引數可被視為local variable,也就是說形式引數相當於在方法中定義了一個區域性變數a,當傳入c時,只是將c指向的物件給a
8.finally 語句塊是在 try 或者 catch 中的 return 語句之前執行的
9.簡述jvm中預設的classLoader與功能
10.switch語句後的控制表示式只能是short、char、int、long整數型別和列舉型別,不能是float,double和boolean型別。String型別是java7開始支援
11.重寫的特性
12.!=和==,當用於基本型別時候,是比較值是否相同;當用於引用型別的時候,是比較物件是否相同,比較記憶體地址

13.null可以被強制型別轉換成任意型別的物件,於是通過它來執行靜態方法
14.如何終止一個執行緒
15.靜態屬性和靜態方法是否可以被繼承
16.列出各種List,Set,Map,Queue並說出他們的同與不同。
17.列出幾種執行緒池
18.解釋一下java記憶體模型
19.解釋一下java程式碼的原子性
20.解釋一下volatile欄位
21.解釋一下synchronized欄位
22.Lock的使用
23.wait()和sleep()區別
24.死鎖產生的條件

二 Android相關

Android部分我就不分幾大塊了。直接列舉,但是列舉到的每一項都是面試經常會問到並且會延伸問的,所以需要深入的去研究。
1.Android事件分發機制,請詳細說下整個流程
2.Android view繪製機制和載入過程,請詳細說下整個流程
3.Activty的載入過程 請詳細介紹下
4.Activity的啟動模式:
5.Activity快取方法:
6.Service的生命週期,兩種啟動方法,有什麼區別:
7.怎麼保證service不被殺死
8.廣播的兩種註冊方法,有什麼區別。
9.Intent可以傳遞哪些資料型別
10.Json有什麼優劣勢
11.動畫有哪幾類,各有什麼特點:
12.Handler、Loop訊息佇列模型,各部分的作用。
13. 怎樣退出終止App:自己設定一個Activity的棧,然後一個個finish()。
14. Android IPC:Binder原理
15.android的優化
16.一個singleton如何實現執行緒的同步問題
17.android重要術語解釋
18.理解Window和WindowManager
19.Bitmap的處理:
20.綜合技術:
21.如何實現一個網路框架(參考Volley)
22.ClassLoader的基礎知識:
23.外掛化框架描述:dynamicLoadApk為例子
24.熱修復:Andfix為例子

三 Android相關總結

上面的列的相關內容,看似很短一句話,但是每一項都需要你深入的去研究,要了解原理,最好去看一下原始碼實現。當然還有一些是我沒寫到的,可能是我寫的時候沒有想起來,並不代表他們不重要,你也需要重視,再來一波推薦:
《Android開發藝術探索》強烈推薦,建議細細的讀,如果粗心大意建議讀兩到三遍,針對性的讀。
《Android進階之光》
《高階Android開發強化實戰》
《Android元件化架構》
《Android熱修復技術原理》
《Android外掛化開發指南》

五 面試心得

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

總結

現在新技術層出不窮,如果每次出新的技術,我們都深入的研究的話,很容易分散精力。新的技術可能很久之後我們才會在工作中用得上,當學的新技術無法學以致用,很容易被我們遺忘,到最後真的需要使用的時候,又要從頭來過(雖然上手會更快)。

我覺得身為技術人,針對新技術應該是持擁抱態度的,入了這一行你就應該知道這是一個活到老學到老的行業,所以面對新技術,不要牴觸,擁抱變化就好了。

Flutter 明顯是一種全新的技術,而對於這個新技術在釋出之初,花一個月的時間學習它,成本確實過高。但是週末花一天時間體驗一下它的開發流程,瞭解一下它的優缺點、能幹什麼或者不能幹什麼。這個時間,並不是我們不能接受的。

如果有時間,其實通讀一遍 Flutter 的文件,是最全面的一次對 Flutter 的瞭解過程。但是如果我們只有 8 小時的時間,我希望能關注一些最值得關注的點。

Android學習PDF+架構視訊+面試文件+原始碼筆記

(跨平臺開發(Flutter)、java基礎與原理,自定義view、NDK、架構設計、效能優化、完整商業專案開發等)