2019 年 Android 面試題18問【附帶Android架構師學習路線】
面試題如下:
1.跨進程通信的幾種方式
2.wait和sleep 的區別3.String,StringBuffer,StringBuilder的區別4.View和SurfaceView的區別5.View的繪製原理
6.簡述JNI7.簡述TCP,UDP,Socket8.音視頻相關類9.進程和線程的區別10.內存泄露如何查看和解決11.View的分發機制,滑動衝突12.RecyclerView和ListView的區別13.recyclerView嵌套卡頓解決如何解決14,談MVC ,MVP,MVVM15.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當多個線程同步操作數據,使用StringBuffer4.View和SurfaceView的區別
View基於主線程刷新UI,SurfaceView子線程又可以刷新UI5.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,VideoView9.進程和線程的區別
概念:進程包括多個線程,一個程序一個進程,多線程的優點可以提高執行效率,提高資源利用率創建: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然後獲取應用數據,為保證數據安全,使用加密存儲
※解決NestedScrollView中,在子View上滑動不觸發滾動事件,卻觸發點擊事件
※使用 SugarAdapter 快速構建 Android 列表頁面
※如何看待小米啟動防回滾機制,這是否跟華為關閉解鎖碼服務有關?
※如何評價出現綠屏問題的Mate20 Pro無法退換貨?
※安卓手機怎麼才能像ios一樣沒開應用都能接收到應用消息?