天天看點

2020年Android面試題彙總(初級)

本博文轉載自:https://www.jianshu.com/p/feb9584b492c  作者:Wocus

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)

未完待續......

2020年Android面試題彙總(中級)​​​​​​​

繼續閱讀