2019 年 Android 面試題18問【附帶Android架構師學習路線】

面試題如下:

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

2.wait和sleep 的區別

3.String,StringBuffer,StringBuilder的區別

4.View和SurfaceView的區別

5.View的繪製原理

6.簡述JNI

7.簡述TCP,UDP,Socket

8.音視頻相關類

9.進程和線程的區別

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

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

12.RecyclerView和ListView的區別

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

14,談MVC ,MVP,MVVM

15.Android性能優化

16.Hander原理

17.activity,fragment傳值問題

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

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

  • Intent,比如撥打電話
  • ContentProvider 資料庫存儲數據
  • Broadcast 廣播通信
  • AIDL通信,通過介面共享數據

2.wait和sleep 的區別

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

3.String,StringBuffer,StringBuilder的區別

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

String str="aaa";
str="bbb";

以上代碼雖然改變了str,但是執行過程是回收str,把值賦給一個新的str

StringBuffer創建之後,可以去修改

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.Android性能優化

布局優化: 減少布局層級,使用ViewStub提高顯示速度,布局服用,儘可能少使用warp_content,刪除空間中無用的屬性,避免過度繪製移除window默認背景,按需顯示展點陣圖,自定義View優化,使用canvas.clipRect()識別可見區域

啟動速度:採用分布載入,非同步載入,延期載入提高應用初始化速度,採用線程初始化數據等,合理的刷新機制

內存方面:防止內存泄露,使用一些第三方工具檢測解決

代碼優化:遵循Java生命周期

安裝包優化:刪除無用資源,優化圖片,代碼混淆,避免重複庫存在,插件化

16.Hander原理

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

17.activity,fragment傳值問題

通過Bundle傳值,在activty定義變數傳值,擴展fragment創建傳值

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

在兩個應用的manifest配置中好相同的shartdUserId屬性,A應用正常保存數據,B應用

createPackageContext("com.netease.nim.demo", CONTEXT_IGNORE_SECURITY)

獲取context然後獲取應用數據,為保證數據安全,使用加密存儲

最後送福利了,現在關注我並且私信【資料】}可以獲取包含源碼解析,自定義View,動畫實現,架構分享等。

內容難度適中,篇幅精鍊,每天只需花上十幾分鐘閱讀即可。

大家可以跟我一起探討,歡迎加群探討,有flutter—性能優化—移動架構—資深UI工程師 —NDK相關專業人員和視頻教學資料,還有更多面試題等你來拿~


推薦閱讀:

解決NestedScrollView中,在子View上滑動不觸發滾動事件,卻觸發點擊事件
使用 SugarAdapter 快速構建 Android 列表頁面
如何看待小米啟動防回滾機制,這是否跟華為關閉解鎖碼服務有關?
如何評價出現綠屏問題的Mate20 Pro無法退換貨?
安卓手機怎麼才能像ios一樣沒開應用都能接收到應用消息?

TAG:Android | Android開發 | 架構師 |