一時間不曉得怎么開頭,恩,昨天去面了個試
人生中第一次面試,算是中型企業,老師內推,筆試過了,技術面沒過,在杭州比較偏僻的山溝溝
說實話第一次面試面中型企業沒過好像也不是很丟臉,先不吐槽公司的位置以及杭州到處施工的山溝溝,先說說筆試。
筆試的問題還算簡單,很基礎,我記得多少就寫多少吧。
筆試
<b>Q:</b>Android四大組件
<b>A:</b>Activity,Service,廣播,內容提供者
<b>E:</b>是廣播接收器而不是廣播。。。嗎?后面兩個不會拼,應該是Activity,Service,Broadcast Receiver,Content Provider
<b>Q:</b>Android 4.4后用()虛擬機代替Dalvik虛擬機
<b>A:</b>ART
<b>E:</b>ART(Android runtime),Dalvik每次運行程序都要編譯,ART會預編譯一次并存儲,不用每次運行都編譯
<b>Q:</b>說出一個Android 6.0或7.0的新特性
<b>A:</b>權限。6.0以后在需要權限的情況下要自己手動寫代碼進行請求
<b>E:</b>我不曉得是寫編程上面的變化,還是用戶體驗上的新功能
<b>Q:</b>Service的啟動方式。Service是否運行在主線程。
<b>A:</b>startService()和bindService()。Service是運行在主線程。
<b>E:</b>后面還有一個問題,不記得了,也沒回答出來。
<b>Q:</b>Intent能傳遞哪些類型的數據
<b>A:</b>Bundle,String,int,long,boolean,float,double,可串行化對象
<b>E:</b>Serializable不會拼,Parcelable也不會拼,而且兩個都不會讀=。=
<b>Q:</b>String,StringBuilder,StringBuffer之間的區別
<b>A:</b>String是字符串常量,StringBuilder和StringBuffer是字符串變量,StringBuilder非線程安全,StringBuffer線程安全
<b>E:</b>這個問題。。。網上一堆
<b>Q:</b>final和static關鍵詞的用法
<b>A:</b>final修飾的變量,在初始化(第一次賦值后)就不能更改;final修飾的方法,不能重寫;final修飾的類,不能被繼承;static修飾的變量,該類的所有實例化對象的該變量都共享同一個內存地址;static修飾的方法,可以用類直接調用該方法,不需要實例化;static修飾的內部類,實例化后不會持有外部類的引用
<b>E:</b>忘了一個static靜態代碼塊,會在加載類的時候執行
<b>Q:</b>Android的數據存儲方式
<b>A:</b>
<b>E:</b>因為寫在那頁紙的最后一行,所以沒看到,所以。。。好吧我承認我很粗心=。=
<b>Q:</b>Android的生命周期
<b>A:</b>—→onCreate()
??????|??????????????↓
??????|????????onStart()?←?onRestart()
??????|??????????????↓????????????????????↑
??????|?????onResume()???????????|
??????|??????????????↓????????????????????|
???killed?????running???????????????|
??????|??????????????↓????????????????????|
??????|???????onPause()????????????|
??????|??????????????↓????????????????????|
??????|——?onStop()??———?|
??????|??????????????↓
??????|—??onDestroy()
onPause(),失去焦點但還能看到界面
onStop(),被完全覆蓋
<b>E:</b>其實有一個細節錯了,onDestroy()左邊的線應該放到onPause()左邊,被destroy了還怎么被kill=。=
<b>Q:</b>線程間通信的方式
<b>A:</b>Handler,AIDL(進程間)。其中Handler,Looper.prepare()為當前線程添加Looper,然后Looper.loop()開啟消息循環(死循環),通過MessageQueue.next()得到Message,調用Message.target.handleMessage()
<b>E:</b>其實原問題的大意是,請列舉你所知道的線程間通信的方式,一開始寫了Handler,后來看他題目好像意思不止一個,就寫了AIDL,畢竟兩個進程也是不同的線程~所以到底一共有哪幾種=。=
最后還有一題開放題,你做過的最有成就感的事。
筆試過了之后就是面試了,說實話第一次不緊張是不可能的,畢竟沒見過這么大的場面=。=
不過有好幾個問題,等我出來之后還是沒想到,不曉得怎么回答。后來還是在回去的路上仔細回想他的問題,反復想了好幾遍才有點想明白過來。
面試這部分,我到現在還沒有上網查過。所以下面所有的之后反復仔細才想到答案的題應該算本該回答上來的題。
面試
首先他叫我自我介紹一下,恩,很慫很尷尬,這段就不說了
接著他看了我做的APP問我圖片用的什么框架。
我說Glide。
然后問我Glide有什么優點。
緩存。。。?圖片質量。。。?
其實我現在有點想一板磚拍死我自己
后來我仔細回想的時候想到Glide的用法,Glide.with(),恩,等等,這他么不是有個綁定activity或Fragment生命周期么(在onPause()和onStop()的時候停止加載?),然后繼續想,可以加載數據很大的圖,可以加載GIF,提供了流式的接口(那個怎么叫,可以一直點下去的),能夠流暢的滑動(所以在滑動的時候停止加載?)
而我偏偏回答了個那什么。。。WTF?
然后問我不用框架自己加載圖片。
突然腦子空白了。
框架用傻了?把圖片下載下來,加載到內存,加載到ImageView想不到?(ImageView可以直接加載文件路徑。。。么?)
又是一板磚。
內心充滿了絕望。
然后。。。恩,我記不清問題的順序了,就先說還有一個沒回答上的問題。
他問我網絡用的什么框架。
我說Retrofit+OkHttp。
接著問這個好用么。
我他么又是一板磚,說學的時候就用OkHttp,沒對比
后來回去的時候想到這個問題,也學著Glide想著怎么用。恩@POST,@GET,這不是有個注解么;然后API的接口類,Observable,Retrofit 2.0不是支持RxJava的Observable接口了么;然后想到Retrofit的初始化,可以自己設置Http Client,可以設置數據轉換器
說實話這三個問題的回答沒有把我直接趕出去我覺得已經夠不錯了。這中間有個問題,Handler,Looper,MessageQueue,Message這個問題,因為看過部分源碼,所以我回答的看的出他還挺滿意的
好像還有一個沒有回答出的問題。。。別打我,這個我真不知道。
他問自定義ViewGroup要重寫哪些方法。
我說onLayout()。
他說onMeasure()不用么。
一定要重寫onMeasure()么,雖然有重寫過View的onDraw(),但是自定義ViewGroup確實沒有接觸過,所以也只是猜的。
我之前筆試不是有一題忘了寫么,他就問我那個問題,Android的數據存儲方式。
我說,SQLite,SharedPreference,文件
他點了點頭,不曉得是不太滿意還是在想下一個問題。
所以有哪里不對么,還是有什么漏下了?
最后兩個我記得的問題。
一個是提到筆試題中的Intent能傳哪些類型的數據,說我寫了很多int,float,long之類的,能不能概括一下。
我說都是基本數據類型。
然后他給我補充,基本數據類型,基本數據類型的數組,還有兩種可序列化對象和Bundle
另外一個是問我有哪幾種引用。
我說強引用,軟引用,弱引用,虛引用。
他說軟引用和弱引用有什么區別。
我說軟引用,內存不夠時,會先回收這部分內存;弱引用,如果只有弱引用,那在下次GC的時候就會被回收,不管內存夠不夠。
接著他補充說,在java中確實是這樣,但是Android在3.0還是幾的時候,已經把軟引用用弱引用來實現了,就是軟引用和弱引用是一樣的,因為軟引用不可控
后面還提了兩句LruCache
差不多就是這樣了,面試官態度也很好,所以確實是自己發揮的不夠好。
其實這次面試,讓我有點愛上面試的感覺。在面試官的技術比你NB的情況下,是可以學到很多細節的東西的,因為面試官會對你的回答做補充或糾正,每次面試都是一次和大牛討教的機會
晚上還有開題報告要改,嘿呀,好氣呀