2020年Android初級面試題彙總,攢了一年的面試題及解答

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

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

2.wait和 sleep 的區別

wait是Object的方法,wait是對象鎖,鎖定方法不讓繼續執行,當執行notify方法後就會繼續執行,sleep 是Thread的方法,sleep 是使線程睡眠,讓出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創建傳值

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)

未完待續......

面試前的系統複習路線

有時候,選擇比努力更加重要,機遇比奮鬥更加重要。但是,機會只留給有準備的人。我們只有時刻準備着,才能在機會到來的時候,去抓住它。

這裏給大家分享一下我的面試複習路線,有需要的朋友可以參考一下:

1、看視頻進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。

2、進行系統梳理知識,提升儲備

客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

系統學習方向:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO

  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化

  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化

  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack

  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發

  • 微信小程序:小程序介紹+UI開發+API操作+微信對接

  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

3、讀源碼,看實戰筆記,學習大神思路

“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。

4、面試前夕,刷題衝刺

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

以上內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 微信 獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章