Android工程師之Android面試大綱

Android工程師之Android面試大綱。

1

Activity面試題

1、Activity是什麼

Activity是四大組件之一,它提供一個界面讓用戶點擊和各種滑動操作,這就是Activity

2、Activity四種狀態

runing

paused

stopped

killed

3、Activity生命周期

onCreate()

onStart()

onResume()

onPause()

onStop()

onDestroy()

onRestart()

4、進程的優先級

空進程

後臺進程

服務進程

可見進程

前臺進程

5、Activity任務棧

先進後出

6、Activity啟動模式

standard

singletop

singletask

singleinstance

7、scheme跳轉協議

Android中的scheme是一種頁面內跳轉協議,通過定義自己的scheme協議,可以跳轉到app中的各個頁面

服務器可以定制化告訴app跳轉哪個頁面

App可以通過跳轉到另一個App頁面

可以通過H5頁面跳轉頁面

2

Fragment面試題

1、Fragment為什麼被稱為第五大組件

Fragment比Activity更節省內存,其切換模式也更加舒適,使用頻率不低於四大組件,且有自己的生命周期,而且必須依附於Activity

2、Activity創建Fragment的方式

靜態創建

動態創建

3、FragmentPageAdapter和FragmentPageStateAdapter的區別

FragmentPageAdapter在每次切換頁面的的時候,是將Fragment進行分離,適合頁面較少的Fragment使用以保存一些內存,對系統內存不會多大影響

FragmentPageStateAdapter在每次切換頁面的時候,是將Fragment進行回收,適合頁面較多的Fragment使用,這樣就不會消耗更多的內存

4、Fragment生命周期

onAttach()

onCreate()

onCreateView()

onActivityCreated()

onStart()

onResume()

onPause()

onStop()

onDestroyView()

onDestroy()

onDetach()

5、Fragment的通信

Fragment調用Activity中的方法:getActivity

Activity調用Fragment中的方法:接口回調

Fragment調用Fragment中的方法:FragmentManager.findFragmentById

6、Fragment的replace、add、remove方法

replace:替代Fragment的棧頂頁面

add:添加Fragment到棧頂頁面

remove:移除Fragment棧頂頁面

3

Service面試題

1、Service是什麼

Service是四大組件之一,它可以在後臺執行長時間運行操作而沒有用戶界面的應用組件

2、Service和Thread的區別

Service是安卓中系統的組件,它運行在獨立進程的主線程中,不可以執行耗時操作。Thread是程序執行的最小單元,分配CPU的基本單位,可以開啟子線程執行耗時操作

Service在不同Activity中可以獲取自身實例,可以方便的對Service進行操作。Thread在不同的Activity中難以獲取自身實例,如果Activity被銷毀,Thread實例就很難再獲取得到

3、Service啟動方式

startService

bindService

4、Service生命周期

startService

onCreate()

onStartCommand()

onDestroy()

bindService

onCreate()

onBind()

onUnbind()

onDestroy()

4

Broadcast Receiver面試題

1、Broadcast Receiver是什麼

Broadcast是四大組件之一,是一種廣泛運用在應用程序之間傳輸信息的機制,通過發送Intent來傳送我們的數據

2、Broadcast Receiver的使用場景

同一App具有多個進程的不同組件之間的消息通信

不同App之間的組件之間的消息通信

3、Broadcast Receiver的種類

普通廣播

有序廣播

本地廣播

Sticky廣播

4、Broadcast Receiver的實現

靜態註冊:註冊後一直運行,盡管Activity、進程、App被殺死還是可以接收到廣播

動態註冊:跟隨Activity的生命周期

5、Broadcast Receiver實現機制

自定義廣播類繼承BroadcastReceiver,復寫onReceiver()

通過Binder機制向AMS進行註冊廣播

廣播發送者通過Binder機制向AMS發送廣播

AMS查找符合相應條件的廣播發送到BroadcastReceiver相應的循環隊列中

消息隊列執行拿到廣播,回調BroadcastReceiver的onReceiver()

6、LocalBroadcastManager特點

本地廣播隻能在自身App內傳播,不必擔心泄漏隱私數據

本地廣播不允許其他App對你的App發送該廣播,不必擔心安全漏洞被利用

本地廣播比全局廣播更高效

以上三點都是源於其內部是用Handler實現的

5

WebView面試題

1、WebView安全漏洞

API16之前存在遠程代碼執行安全漏洞,該漏洞源於程序沒有正確限制使用WebView.addJavascriptInterface方法,遠程攻擊者可通過使用Java反射機制利用該漏洞執行任意Java對象的方法

2、WebView銷毀步驟

WebView在其他容器上時(如:LinearLayout),當銷毀Activity時,需要在onDestroy()中先移除容器上的WebView,然後再將WebView.destroy(),這樣就不會導致內存泄漏

3、WebView的jsbridge

客戶端和服務端之間可以通過Javascript來互相調用各自的方法

4、WebViewClient的onPageFinished

WebViewClient的onPageFinished在每次完成頁面的時候調用,但是遇到未加載完成的頁面跳轉其他頁面時,就會一直調用,使用WebChromeClient.onProgressChanged可以替代

5、WebView後臺耗電

在WebView加載頁面的時候,會自動開啟線程去加載,如果不很好的關閉這些線程,就會導致電量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)結束當前正在運行中的java虛擬機

6、WebView硬件加速

Android3.0引入硬件加速,默認會開啟,WebView在硬件加速的情況下滑動更加平滑,性能更加好,但是會出現白塊或者頁面閃爍的副作用,建議WebView暫時關閉硬件加速

7、WebView內存泄漏

由於WebView是依附於Activity的,Activity的生命周期和WebView啟動的線程的生命周期是不一致的,這會導致WebView一直持有對這個Activity的引用而無法釋放,解決方案如下

獨立進程,簡單暴力,不過可能涉及到進程間通信(推薦)

動態添加WebView,對傳入WebView中使用的Context使用弱引用

6

Binder面試題

1、Linux內核的基本知識

進程隔離/虛擬地址空間:進程間是不可以共享數據的,相當於被隔離,每個進程被分配到不同的虛擬地址中

系統調用:Linux內核對應用有訪問權限,用戶隻能在應用層通過系統調用,調用內核的某些程序

binder驅動:它負責各個用戶的進程,通過binder通信內核來進行交互的模塊

2、為什麼使用Binder

性能上,相比傳統的Socket更加高效

安全性高,支持協議雙方互相校驗

3、Binder通信模型

Service服務端通過Binder驅動在ServiceManager的查找表中註冊Object對象的add方法

Client客戶端通過Binder驅動在ServiceManager的查找表中找到Object對象的add方法,並返回proxy的add方法,add方法是個空實現,proxy也不是真正的Object對象,是通過Binder驅動封裝好的代理類的add方法

當Client客戶端調用add方法時,Client客戶端通過Binder驅動將proxy的add方法,請求ServiceManager來找到Service服務端真正對象的add方法,進行調用

4、AIDL

客戶端通過aidl文件的Stub.asInterface()方法,拿到Proxy代理類

通過調用Proxy代理類的方法,將參數進行封包後,調用底層的transact()方法

transact()方法會回調onTransact()方法,進行參數的解封

在onTransact()方法中調用服務端對應的方法,並將結果返回

7

Handler面試題

1、Handler是什麼

Handler通過發送和處理Message和Runnable對象來關聯相對應線程的MessageQueue

2、Handler使用方法

post(runnable)

sendMessage(message)

3、Handler工作原理

Android進階——Android消息機制之Looper、Handler、MessageQueen

https://blog.csdn.net/qq_30379689/article/details/53394061

4、Handler引起的內存泄漏

原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放

解決:

Handler內部持有外部Activity的弱引用

Handler改為靜態內部類

Handler.removeCallback()

8

AsyncTask面試題

1、AsyncTask是什麼

它本質上就是一個封裝瞭線程池和Handler的異步框架

2、AsyncTask使用方法

三個參數

Params:表示後臺任務執行時的參數類型,該參數會傳給AysncTask的doInBackground()方法

Progress:表示後臺任務的執行進度的參數類型,該參數會作為onProgressUpdate()方法的參數

Result:表示後臺任務的返回結果的參數類型,該參數會作為onPostExecute()方法的參數

五個方法

onPreExecute():異步任務開啟之前回調,在主線程中執行

doInBackground():執行異步任務,在線程池中執行

onProgressUpdate():當doInBackground中調用publishProgress時回調,在主線程中執行

onPostExecute():在異步任務執行之後回調,在主線程中執行

onCancelled():在異步任務被取消時回調

3、AsyncTask工作原理

Android進階——多線程系列之異步任務AsyncTask的使用與源碼分析

https://blog.csdn.net/qq_30379689/article/details/53203556

4、AsyncTask引起的內存泄漏

原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放

解決:

AsyncTask內部持有外部Activity的弱引用

AsyncTask改為靜態內部類

AsyncTask.cancel()

5、AsyncTask生命周期

在Activity銷毀之前,取消AsyncTask的運行,以此來保證程序的穩定

6、AsyncTask結果丟失

由於屏幕旋轉、Activity在內存緊張時被回收等情況下,Activity會被重新創建,此時,舊的AsyncTask持有舊的Activity引用,這個時候會導致AsyncTask的onPostExecute()對UI更新無效

7、AsyncTask並行or串行

AsyncTask在Android 2.3之前默認采用並行執行任務,AsyncTask在Android 2.3之後默認采用串行執行任務

如果需要在Android 2.3之後采用並行執行任務,可以調用AsyncTask的executeOnExecutor()

9

HandlerThread面試題

1、HandlerThread產生背景

當系統有多個耗時任務需要執行時,每個任務都會開啟一個新線程去執行耗時任務,這樣會導致系統多次創建和銷毀線程,從而影響性能。為瞭解決這一問題,Google提供瞭HandlerThread,HandlerThread是在線程中創建一個Looper循環器,讓Looper輪詢消息隊列,當有耗時任務進入隊列時,則不需要開啟新線程,在原有的線程中執行耗時任務即可,否則線程阻塞

2、HanlderThread的特點、

HandlerThread本質上是一個線程,繼承自Thread

HandlerThread有自己的Looper對象,可以進行Looper循環,可以創建Handler

HandlerThread可以在Handler的handlerMessage中執行異步方法

HandlerThread優點是異步不會堵塞,減少對性能的消耗

HandlerThread缺點是不能同時繼續進行多任務處理,需要等待進行處理,處理效率較低

HandlerThread與線程池不同,HandlerThread是一個串行隊列,背後隻有一個線程。

10

IntentService面試題

1、IntentService是什麼

IntentService是繼承自Service並處理異步請求的一個類,其內部采用HandlerThread和Handler實現的,在IntentService內有一個工作線程來處理耗時操作,其優先級比普通Service高。當任務完成後,IntentService會自動停止,而不需要手動調用stopSelf()。另外,可以多次啟動IntentService,每個耗時操作都會以工作隊列的方式在IntentService中onHandlerIntent()回調方法中執行,並且每次隻會執行一個工作線程

2、IntentService使用方法

創建Service繼承自IntentService

覆寫構造方法和onHandlerIntent()方法

在onHandlerIntent()中執行耗時操作

11

視圖工作機制面試題

Android進階——Android視圖工作機制之measure、layout、draw

https://blog.csdn.net/qq_30379689/article/details/54588736

Android事件分發機制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

https://blog.csdn.net/qq_30379689/article/details/53967177

12

ListView面試題

1、ListView是什麼

ListView是能將一個數據集合以動態滾動的方式展示到用戶界面上的View

2、ListView的RecycleBin機制

3、ListView的優化

重用convertView

使用ViewHolder

圖片三級緩存

監聽滑動事件

少用透明View

開啟硬件加速

13

Android項目構建面試題

1、android構建流程

2、jenkins持續集成構建

這裡可參考蒲公英文檔

https://www.pgyer.com/doc/view/jenkins

3、Git常用命令

git init:倉庫的初始化

git status:查看當前倉庫的狀態

git diff:查看倉庫與上次修改的內容

git add:將文件放進暫存區

git commit:提交代碼

git clone:克隆代碼

git bransh:查看當前分支

git checkout:切換當前分支

4、git工作流

fork/clone(主流)

fork:將別人的倉庫代碼fork到自己的倉庫上

clone:克隆下自己倉庫的代碼

update、commit:修改代碼並提交到自己的倉庫

push:提交到自己的倉庫

pull request:請求添加到別人的倉庫

clone

5、proguard是什麼

ProGuard工具是用於壓縮、優化和混淆我們的代碼,其主作用是移除或混淆代碼中無用類、字段、方法和屬性

6、proguard技術功能

壓縮

優化

混淆

預檢測

7、proguard工作原理

將無用的字段或方法存入到EntryPoint中,將非EntryPoint的字段和方法進行替換

8、為什麼要混淆

由於Java是一門跨平臺的解釋性語言,其源代碼被編譯成class字節碼來適應其他平臺,而class文件包含瞭Java源代碼信息,很容易被反編譯

14

ANR面試題

1、什麼是ANR

Application Not Responding,頁面無響應的對話框

2、發生ANR的條件

應用程序的響應性是由ActivityManager和WindowManager系統服務監視的,當ANR發生條件滿足時,就會彈出ANR的對話框

Activity超過5秒無響應

BroadcastReceiver超過10秒無響應

Service超過20秒無響應

3、造成ANR的主要原因

主線程被IO操作阻塞

Activity的所有生命周期回調都是執行在主線程的

Service默認執行在主線程中

BoardcastReceiver的回調onReceive()執行在主線程中

AsyncTask的回調除瞭doInBackground,其他都是在主線程中

沒有使用子線程Looper的Handler的handlerMessage,post(Runnable)都是執行在主線程中

4、如何解決ANR

使用AsyncTask處理耗時IO操作

使用Thread或HandlerThread提供優先級

使用Handler處理工作線程的耗時操作

Activity的onCreate和onResume回調盡量避免耗時操作

15

OOM面試題

1、什麼是OOM

OOM指Out of memory(內存溢出),當前占用內存加上我們申請的內存資源超過瞭Dalvik虛擬機的最大內存限制就會拋出Out of memory異常

2、OOM相關概念

內存溢出:指程序在申請內存時,沒有足夠的空間供其使用

內存泄漏:指程序分配出去的內存不再使用,無法進行回收

內存抖動:指程序短時間內大量創建對象,然後回收的現象

3、解決OOM

Bitmap相關

圖片壓縮

加載縮略圖

在滾動時不加載圖片

回收Bitmap

使用inBitmap屬性

捕獲異常

其他相關

listview重用convertView、使用lru

避免onDraw方法執行對象的創建

謹慎使用多進程

16

Bitmap面試題

1、recycle

在安卓3.0以前Bitmap是存放在堆中的,我們隻要回收堆內存即可

在安卓3.0以後Bitmap是存放在內存中的,我們需要回收native層和Java層的內存

官方建議我們3.0以後使用recycle方法進行回收,該方法也可以不主動調用,因為垃圾回收器會自動收集不可用的Bitmap對象進行回收

recycle方法會判斷Bitmap在不可用的情況下,將發送指令到垃圾回收器,讓其回收native層和Java層的內存,則Bitmap進入dead狀態

recycle方法是不可逆的,如果再次調用getPixels()等方法,則獲取不到想要的結果

2、LruCache原理

LruCache是個泛型類,內部采用LinkedHashMap來實現緩存機制,它提供get方法和put方法來獲取緩存和添加緩存,其最重要的方法trimToSize是用來移除最少使用的緩存和使用最久的緩存,並添加最新的緩存到隊列中

3、計算inSampleSize

4、縮略圖

5、保存Bitmap

6、保存到SD卡

7、三級緩存

網絡緩存

本地緩存

內存緩存

17

UI卡頓面試題

1、UI卡頓原理

View的繪制幀數保持60fps是最佳,這要求每幀的繪制時間不超過16ms(1000/60),如果安卓不能在16ms內完成界面的渲染,那麼就會出現卡頓現象

2、UI卡頓的原因分析

在UI線程中做輕微的耗時操作,導致UI線程卡頓

佈局Layout過於復雜,無法在16ms內完成渲染

同一時間動畫執行的次數過多,導致CPU和GPU負載過重

overDraw,導致像素在同一幀的時間內被繪制多次,使CPU和GPU負載過重

View頻繁的觸發measure、layout,導致measure、layout累計耗時過多和整個View頻繁的重新渲染

頻繁的觸發GC操作導致線程暫停,會使得安卓系統在16ms內無法完成繪制

冗餘資源及邏輯等導致加載和執行緩慢

ANR

3、UI卡頓的優化

佈局優化

使用include、ViewStub、merge

不要出現過於嵌套和冗餘的佈局

使用自定義View取代復雜的View

ListView優化

復用convertView

滑動不加載

背景和圖片優化

縮略圖

圖片壓縮

避免ANR

不要在UI線程中做耗時操作

18

內存泄漏面試題

1、Java內存泄漏引起的主要原因

長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄漏

2、Java內存分配策略

靜態存儲區:又稱方法區,主要存儲全局變量和靜態變量,在整個程序運行期間都存在

棧區:方法體的局部變量會在棧區創建空間,並在方法執行結束後會自動釋放變量的空間和內存

堆區:保存動態產生的數據,如:new出來的對象和數組,在不使用的時候由Java回收器自動回收

3、Android解決內存泄漏的例子

單例造成的內存泄漏:在單例中,使用context.getApplicationContext()作為單例的context

匿名內部類造成的內存泄漏:由於非靜態內部類持有匿名外部類的引用,必須將內部類設置為static

Handler造成的內存泄漏:使用static的Handler內部類,同時在實現內部類中持有Context的弱引用

避免使用static變量:由於static變量會跟Activity生命周期一致,當Activity退出後臺被後臺回收時,static變量是不安全,所以也要管理好static變量的生命周期

資源未關閉造成的內存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完後要關閉

AsyncTask造成的內存泄漏:由於非靜態內部類持有匿名內部類的引用而造成內存泄漏,可以通過AsyncTask內部持有外部Activity的弱引用同時改為靜態內部類或在onDestroy()中執行AsyncTask.cancel()進行修復

19

內存管理面試題

1、Android內存管理機制

分配機制

管理機制

2、內存管理機制的特點

更少的占用內存

在合適的時候,合理的釋放系統資源

在系統內存緊張的時候,能釋放掉大部分不重要的資源

能合理的在特殊生命周期中,保存或還原重要數據

3、內存優化方法

Service完成任務後應停止它,或用IntentService(因為可以自動停止服務)代替Service

在UI不可見的時候,釋放其UI資源

在系統內存緊張的時候,盡可能多的釋放非重要資源

避免濫用Bitmap導致內存浪費

避免使用依賴註入框架

使用針對內存優化過的數據容器

使用ZIP對齊的APK

使用多進程

20

冷啟動和熱啟動面試題

1、什麼是冷啟動和熱啟動

冷啟動:在啟動應用前,系統中沒有該應用的任何進程信息

熱啟動:在啟動應用時,在已有的進程上啟動應用(用戶使用返回鍵退出應用,然後馬上又重新啟動應用)

2、冷啟動和熱啟動的區別

冷啟動:創建Application後再創建和初始化MainActivity

熱啟動:創建和初始化MainActivity即可

3、冷啟動時間的計算

這個時間值從應用啟動(創建進程)開始計算,到完成視圖的第一次繪制為止

4、冷啟動流程

Zygote進程中fork創建出一個新的進程

創建和初始化Application類、創建MainActivity

inflate佈局、當onCreate/onStart/onResume方法都走完

contentView的measure/layout/draw顯示在界面上

總結:Application構造方法->attachBaseContext()->onCreate()->Activity構造方法->onCreate()->配置主題中背景等屬性->onStart()->onResume()->測量佈局繪制顯示在界面上

5、冷啟動優化

減少第一個界面onCreate()方法的工作量

不要讓Application參與業務的操作

不要在Application進行耗時操作

不要以靜態變量的方式在Application中保存數據

減少佈局的復雜性和深度

不要在mainThread中加載資源

通過懶加載方式初始化第三方SDK

21

其他優化面試題

1、Android不用靜態變量存儲數據

靜態變量等數據由於進程已經被殺死而被初始化

使用其他數據傳輸方式:文件/sp/contentProvider

2、SharePreference安全問題

不能跨進程同步

文件不宜過大

3、內存對象序列化

Serializeble:是java的序列化方式,Serializeble在序列化的時候會產生大量的臨時對象,從而引起頻繁的GC

Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要將數據存儲在硬盤上的情況

4、避免在UI線程中做繁重的操作

22

架構模式面試題

Android基礎——框架模式MVC在安卓中的實踐

https://blog.csdn.net/qq_30379689/article/details/52909656

Android基礎——框架模式MVP在安卓中的實踐

https://blog.csdn.net/qq_30379689/article/details/52910567

Android基礎——框架模式MVVM之DataBinding的實踐

https://blog.csdn.net/qq_30379689/article/details/53037430

23

插件化面試題

1、插件化解決的問題

動態加載APK(反射、類加載器)

資源加載(反射、AssetManager、獨立資源、分段資源)

代碼加載(反射獲取生命周期)

2、類加載器(Java中字節碼添加到虛擬機中)

DexClassLoader:能夠加載未安裝的jar/apk/dex,主要用於動態加載和代碼熱更新

PathClassLoader:隻能加載系統中已經安裝過的apk

24

熱更新面試題

1、熱更新主要流程

線上檢查到Crash

拉出Bugfix分支修復Crash問題

jenkins構建和補丁生成

app通過推送或主動拉取補丁文件

將Bugfix代碼合到master上

2、熱更新主流框架

Dexposed

AndFix

Nuwa

Tinker

3、熱更新的原理

在ClassLoader創建一個dexElements數組

將修復好的dex文件存放在dexElements數組的最前面

ClassLoader會遍歷dexElements數組,找到最前面的dex文件優先加載

25

進程保活面試題

1、進程的優先級

空進程

後臺進程

服務進程

可見進程

前臺進程

2、Android進程回收策略

Low memory Killer(定時執行):通過一些比較復雜的評分機制,對進程進行打分,然後將分數高的進程判定為bad進程,殺死並釋放內存

OOM_ODJ:判別進程的優先級

3、Android保活方案

利用系統廣播拉活

利用系統Service機制拉活

利用Native進程拉活

利用JobScheduler機制拉活

利用賬號同步機制拉活

26

Lint面試題

1、什麼是Android Lint

Android Lint是一個靜態代碼分析工具,它能夠對你的Android項目中潛在的Bug、可優化的代碼、安全性、性能、可用性、可訪問性、國際化等進行檢查

2、Lint工作流程

3、配置Lint

創建Lint.xml到根目錄下,自定義Lint安全等級等

在Java文件中可以使用@suppressLint(“NewApi”)來忽視Lint的報錯

在xml文件中可以使用tool:ignore(“UnusedResources”)來忽視Lint的報錯

自定義Lint檢查,可以創建類,繼承Detector和實現JavaPsiScanner

27

Kotlin面試題

1、什麼是Kotlin

Kotlin是一種基於JVM的編程語言

對Java的一種拓展,比Java更簡潔

Kotlin支持函數式編程

Kotlin類和Java類可以相互調用

2、Kotlin環境搭建

直接在Plugin中下載Kotlin插件即可

系統會自動配置到Kotlin環境

You May Also Like