2019年Android面試題彙總
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.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建立傳值
未完待續......