拿下頭條,美團,阿里Offer現給大家總結2020年最新Android面試題

前言

本文從面試準備、面試技巧等方面分享一些個人經驗。希望能給大家帶來幫助。

2.面試情況

阿里(螞蟻金服):拿到 offer

頭條(抖音、火山):拿到 offer

美團(美團平臺):拿到 offer

騰訊(騰訊音樂):二面掛

3. 準備

這部分將結合我自己的經驗,為大家準備面試提供一個參考。

儘早開始準備

首先,儘早開始準備。足夠的時間是充足的準備的基本保證。不用擔心因為早準備而遺忘的問題,因為每一次看都會比上一次看快很多。隨著複習次數增加,對知識點的掌握也會更加牢固。我一些同學到面試前一個月甚至前幾天才準備,這時再想準備好龐大的知識點就力不從心了,自然面試結果也不好。因此,一定要儘早開始準備,一定要儘早開始準備,一定要儘早開始準備。我是在面試前半年左右時開始系統地準備,那時其實已經有點晚了。

形成自己的面試知識體系面試,簡單地說就是回答出更多的問題。而準備面試,自然就要掌握更多面試中可能問到的知識。為了方便系統地對知識點進行學習和複習,我覺得在準備階段形成一個自己的面試知識體系非常重要。並且,在學習過程中,你的體系要不斷地完善。各種零散的知識點是不方便系統地學習和複習的。

具體來說,大致過程如下:

1)整理面試需要掌握的知識點。可以通過 Github 和 博客上別人整理的面試總結或者知識腦圖,結合自己的項目經歷和麵試經驗整理出一個面試涉及的知識體系。

2)結合自己的情況確定學習計劃。可以看著自己整理的知識體系,思考一下這兩個問題:“我掌握了哪些知識、掌握程度如何”、“需要學習哪些知識、優先級如何”。

3)學習新的知識和鞏固自己擅長的知識。同時,不斷完善自己的知識體系。

4)在自己心中形成一個知識體系之後,不僅學習的時候更有針對性和計劃性,面試時心態也會好很多。另外寫簡歷和麵試時也可以用一些技巧,比如在對自己有一個明確的認識的前提下可以避開自己不擅長的知識點,突出自己擅長的知識點。

面試題

1.跨進程通信的幾種方式

Intent,比如撥打電話ContentProvider數據庫存儲數據Broadcast廣播通信AIDL通信,通過接口共享數據

2.wait和sleep 的區別

wait是Object的方法,wait是對象鎖,鎖定方法不讓繼續執行,當執行notify方法後就會繼續執行,sellp是Thread的方法,sellp是使線程睡眠,讓出cpu,結束後自動繼續執行

3.String,StringBuffer,StringBuilder的區別

String不可改變對象,一旦創建就不能修改

<code> 

String

str

=

"aaa"

;

str

=

"bbb"

; /<code>

以上代碼雖然改變了str,但是執行過程是回收str,把值賦給一個新的strStringBuffer創建之後,可以去修改StringBuilder也可修改,執行效率高於StringBuffer,不安全當字符賦值少使用String字符賦值頻繁使用StringBuilder當多個線程同步操作數據,使用StringBuffer

4.View和SurfaceView的區別

View基於主線程刷新UI,SurfaceView子線程又可以刷新UI

5.View的繪製原理

View為所有圖形控件的基類,View的繪製由3個函數完成measure,計算視圖的大小layout,提供視圖要顯示的位置draw,繪製

6.簡述JNI

是java和c語言之間的橋樑,由於java是一種半解釋語言,可以被反編譯出來,一種重要涉及安全的代碼就使用了C編程,再者很多底層功能調用C語言都實現了Java沒必要重複造輪子,所以定義了JNI接口的實現

7.簡述TCP,UDP,Socket

TCP是經過3次握手,4次揮手完成一串數據的傳送UDP是無連接的,知道IP地址和端口號,向其發送數據即可,不管數據是否發送成功Socket是一種不同計算機,實時連接,比如說傳送文件,即時通訊

8.音視頻相關類

總體來說,分為幾個類視頻錄製方面,Camear攝像頭錄製視頻類,MediaProjection屏幕錄製視頻類編碼方面,MediaCodec,MediaRecorder預覽方面,SurfaceView,GLSurfaceView,TextureView,VideoView

9.進程和線程的區別

概念:進程包括多個線程,一個程序一個進程,多線程的優點可以提高執行效率,提高資源利用率創建:Thread類和Runnable接口,常用方法有:start()用於啟動線程run()調用線程對象中的run方法join()合併插隊到當前線程sellp()睡眠釋放cpu資源setPriority()設置線程優先級

10.內存洩露如何查看和解決

概念:有些對象只有有限的生命週期,當他們的任務完成之後,它們將被垃圾回收,如果在對象的生命週期本該結束的時候,這個對象還被一系列的引用,著就會導致內存洩露。解決方法:使用開源框架LeakCanary檢測針對性解決常見的內存洩露有:單例造成的內存洩露,例如單例中的Context生命週期大於本身Context生命週期線程使用Hander造成的內存卸扣,當activity已經結束,線程依然在運行更新UI非靜態類使用靜態變量導致無法回收釋放造成洩露WebView網頁過多造成內存洩露資源未關閉造成洩露,例如數據庫使用完之後關閉連接

11.View的分發機制,滑動衝突

View的事件傳遞順序有3個重要的方法,dispatchTouchEvent()是否消耗了本次事件,onInterceptTouchEvent()是否攔截了本次事件,onTouchEvent()是否處理本次事件,滑動衝突分為同方向滑動衝突,例如ScrollView和ListView,同方向滑動衝突,可以計算ListView高度而動態設置ListView的高度,ScrollView高度可變。例如ViewPager和ListView,不同方向滑動衝突,一個是橫向滑動一個是豎直滑動,不同方向滑動可以判斷滑動的x,y軸是橫向還是豎直滑動,如果判斷得到是橫向滑動,就攔截ListView的事件,豎則反之。

12.RecyclerView和ListView的區別

緩存上:前者緩存的是View+ViewHolder+flag,不用每次調用findViewById,後者則只是緩存View刷新數據方面,前者提供了局部刷新,後者則全部刷新

13.recyclerView嵌套卡頓解決如何解決

設置預加載的數量LinearLayoutManager.setInitialPrefetchItemCount(4),默認是預加載2個,設置子項緩存,設置自帶滑動衝突解決屬性rv.setHasFixedSize(true); rv.setNestedScrollingEnabled(false);可以完美解決,不過Google不推薦RecyClerView嵌套使用,需要嵌套儘量找類似於ExpandableListView 第三方控件來解決

14,談MVC ,MVP,MVVM

MVC:View是可以直接訪問Model的!從而,View裡會包含Model信息,不可避免的還要包括一些 業務邏輯。 在MVC模型裡,更關注的Model的不變,而同時有多個對Model的不同顯示,及View。所以,在MVC模型裡,Model不依賴於View,但是 View是依賴於Model的。不僅如此,因為有一些業務邏輯在View裡實現了,導致要更改View也是比較困難的,至少那些業務邏輯是無法重用的。MVP:MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數據,View負 責顯示。作為一種新的模式,MVP與MVC有著一個重大的區別:在MVP中View並不直接使用Model,它們之間的通信是通過Presenter (MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會從直接Model中讀取數據而不是通過 Controller。MVVM:數據雙向綁定,通過數據驅動UI,M提供數據,V視圖,VM即數據驅動層

15.dagger2

Dagger2是一個主要用於依賴注入的框架,減少初始化對象操作,降低耦合度

16Android性能優化

佈局優化: 減少佈局層級,使用ViewStub提高顯示速度,佈局服用,儘可能少使用warp_content,刪除空間中無用的屬性,避免過度繪製移除window默認背景,按需顯示展位圖,自定義View優化,使用canvas.clipRect()識別可見區域啟動速度:採用分佈加載,異步加載,延期加載提高應用初始化速度,採用線程初始化數據等,合理的刷新機制內存方面:防止內存洩露,使用一些第三方工具檢測解決代碼優化:遵循Java生命週期安裝包優化:刪除無用資源,優化圖片,代碼混淆,避免重複庫存在,插件化

17.Hander原理

Handler,loop輪詢檢測發送消息到MessagerQuery,MessageQuery對Message入列,Handler回調方法處理消息,重寫handMessage方法刷新ui

18.SharedPreference跨進程使用會怎麼樣?如何保證跨進程使用安全?

在兩個應用的manifest配置中好相同的shartdUserId屬性,A應用正常保存數據,B應用createPackageContext("com.netease.nim.demo", CONTEXT_IGNORE_SECURITY)獲取context然後獲取應用數據,為保證數據安全,使用加密存儲

19.推送到達率如何提高

判手機系統,小米使用小米推送,華為使用華為推送,其他手機使用友盟推送20.activity,fragment傳值問題通過Bundle傳值,在activty定義變量傳值,擴展fragment創建傳值21.activity與fragment區別生命週期:fragment從創建倒銷燬整個生命週期依次為onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach()與activity不同的方法有onAttach():當Fragment和Activity建立關聯的時候調用;onCreateView():當Fragment創建視圖調用;onActivityCreated:與Fragment相關聯的Activity完成onCreate()之後調用;onDestoryView():在Fragment中的佈局被移除時調用;onDetach():當Fragment和Activity解除關聯時調用;activity常用的生命週期只有以下幾個;onCreate(): 表示 Activity 正在被創建,常用來 初始化工作,比如調用 setContentView 加載界面佈局資源,初始化 Activity 所需數據等;onRestart():表示 Activity 正在重新啟動,一般情況下,當前Acitivty 從不可見重新變為可見時,OnRestart就會被調用;onStart(): 表示 Activity 正在被啟動,此時 Activity 可見但不在前臺,還處於後臺,無法與用戶交互;onResume(): 表示 Activity 獲得焦點,此時 Activity 可見且在前臺並開始活動,這是與 onStart 的區別所在;onPause(): 表示 Activity 正在停止,此時可做一些 存儲數據、停止動畫等工作,但是不能太耗時,因為這會影響到新 Activity的顯示,onPause 必須先執行完,新 Activity 的 onResume 才會執行;onStop(): 表示 Activity 即將停止,可以做一些稍微重量級的回收工作,比如註銷廣播接收器、關閉網絡連接等,同樣不能太耗時;onDestroy(): 表示 Activity 即將被銷燬,這是 Activity 生命週期中的最後一個回調,常做 回收工作、資源釋放;區別:Fragment比Activity多出四個回調週期,控制操作上更靈活;Fragment可以在xml文件中直接寫入,也可以在Activity中動態添加;Fragment可以使用show()/hide()或者replace()對Fragment進行切換,切換的時候不會出現明顯的效果,Activity切換的時候會有明顯的翻頁或其他效果;

22.Fragment中add與replace的區別?

add不會重新初始化fragment,replace每次都會;添加相同的fragment時,replace不會有任何變化,add會報IllegalStateException 異常;replace 先 remove 掉相同 id 的所有 fragment,然後在add 當前的這個 fragment,而 add 是覆蓋前一個fragment。所以如果使用 add 一般會伴隨 hide()和show(),避免佈局重疊;使用 add,如果應用放在後臺,或以其他方式被系統銷燬,再打開時,hide()中引用的 fragment 會銷燬,所以依然會出現佈局重疊 bug,可以使用 replace 或使用 add時,添加一個 tag 參數;

23.FragmentPagerAdapter 與 與 FragmentStatePagerAdapter 的區別與使用場景?

FragmentPagerAdapter 的每個 Fragment 會持久的保存在 FragmentManager 中,只要用戶可以返回到頁面中,它都不會被銷燬。因此適用於那些數據 相對靜態的頁,Fragment 數量也比較少的那種;FragmentStatePagerAdapter 只保留當前頁面,當頁面不可見時,該 Fragment 就會被消除,釋放其資源。因此適用於那些 數據動態性較大、 佔用內存較多,多 Fragment 的情況;

24.說下Activity 的四種啟動模式、應用場景 ?

standard 標準模式: 每次啟動一個 Activity 都會重新創建一個新的實例,不管這個實例是否已經存在,此模式的 Activity 默認會進入啟動它的 Activity 所屬的任務棧中;singleTop 棧頂複用模式: 如果新 Activity 已經位於任務棧的棧頂,那麼此 Activity 不會被重新創建,同時會回調 onNewIntent方法,如果新 Activity 實例已經存在但不在棧頂,那麼Activity 依然會被重新創建;singleTask 棧內複用模式: 只要 Activity 在一個任務棧中存在,那麼多次啟動此 Activity 都不會重新創建實例,並回調onNewIntent 方法,此模式啟動 Activity A,系統首先會尋找是否存在 A 想要的任務棧,如果不存在,就會重新創建一個任務棧,然後把創建好 A 的實例放到棧中;singleInstance單實例模式: 這是一種加強的 singleTask 模式,具有此種模式的 Activity 只能單獨地位於一個任務棧中,且此任務棧中只有唯一一個實例;

25.說下 Activity 跟 跟 window , view 之間的關係?

Activity 創建時通過 attach()初始化了一個 Window 也就是PhoneWindow,一個 PhoneWindow 持有一個DecorView 的實例,DecorView 本身是一個 FrameLayout,繼承於 View,Activty 通過setContentView 將xml 佈局控件不斷 addView()添加到 View 中,最終顯示到 Window 於我們交互;

26.橫豎屏切換的Activity 生命週期變化?

不設置 Activity 的 android:configChanges 時,切屏會銷燬當前Activity,然後重新加載調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次;onPause()→onStop()→onDestory()→onCreate()→onStart()→onResume()設置 Activity 的 android:configChanges=" orientation",經過機型測試在 Android5.1 即 即 API 3 23 級別下,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次在 Android9 即 即 API 8 28 級別下,切屏不會重新調用各個生命週期,只會執行 onConfigurationChanged方法官方糾正後,原話如下如果您的應用面向 Android 2 3.2 即 即 API 級別 3 13 或更高級別(按照 minSdkVersion 和 targetSdkVersion)

由於文章過長需要完整版的可以私信我(面試),我分享給大家,希望可以一起學習交流。


分享到:


相關文章: