1. 程式人生 > 其它 >2021Android高階進階學習資料,騰訊Android面試必問

2021Android高階進階學習資料,騰訊Android面試必問

正文如下

  • Activity面試題
  • Fragment面試題
  • Service面試題
  • Broadcast Receiver面試題
  • WebView面試題
  • Binder面試題
  • Handler面試題
  • AsyncTask面試題
  • HandlerThread面試題
  • IntentService面試題
  • 檢視工作機制面試題
  • 事件分發機制面試題
  • ListView面試題
  • Android專案構建面試題(由於篇幅太長,今天就先分享到這裡)
  • ANR面試題
  • OOM面試題
  • Bitmap面試題
  • UI卡頓面試題
  • 記憶體洩漏面試題
  • 記憶體管理面試題
  • 冷啟動和熱啟動面試題
  • 其他優化面試題
  • 架構模式面試題
  • 外掛化面試題
  • 熱更新面試題
  • 程序保活面試題
  • Lint面試題
  • Kotlin面試題

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頁面跳轉頁面

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棧頂頁面

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()

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實現的

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使用弱引用

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()方法中呼叫服務端對應的方法,並將結果返回

Handler面試題

1、Handler是什麼

Handler通過傳送和處理Message和Runnable物件來關聯相對應執行緒的MessageQueue

2、Handler使用方法

  • post(runnable)
  • sendMessage(message)

3、Handler工作原理

4、Handler引起的記憶體洩漏

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

解決:

  • Handler內部持有外部Activity的弱引用
  • Handler改為靜態內部類
  • Handler.removeCallback()

AsyncTask面試題

1、AsyncTask是什麼

它本質上就是一個封裝了執行緒池和Handler的非同步框架

2、AsyncTask使用方法

三個引數

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

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

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

五個方法

  • onPreExecute():非同步任務開啟之前回調,在主執行緒中執行

  • doInBackground():執行非同步任務,線上程池中執行

  • onProgressUpdate():當doInBackground中呼叫publishProgress時回撥,在主執行緒中執行

  • onPostExecute():在非同步任務執行之後回撥,在主執行緒中執行

  • onCancelled():在非同步任務被取消時回撥

3、AsyncTask工作原理

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()

HandlerThread面試題

1、HandlerThread產生背景

當系統有多個耗時任務需要執行時,每個任務都會開啟一個新執行緒去執行耗時任務,這樣會導致系統多次建立和銷燬執行緒,從而影響效能。為了解決這一問題,Google提供了HandlerThread,HandlerThread是線上程中建立一個Looper迴圈器,讓Looper輪詢訊息佇列,當有耗時任務進入佇列時,則不需要開啟新執行緒,在原有的執行緒中執行耗時任務即可,否則執行緒阻塞

2、HanlderThread的特點、

  • HandlerThread本質上是一個執行緒,繼承自Thread
  • HandlerThread有自己的Looper物件,可以進行Looper迴圈,可以建立Handler
  • HandlerThread可以在Handler的handlerMessage中執行非同步方法
  • HandlerThread優點是非同步不會堵塞,減少對效能的消耗
  • HandlerThread缺點是不能同時繼續進行多工處理,需要等待進行處理,處理效率較低
  • HandlerThread與執行緒池不同,HandlerThread是一個序列佇列,背後只有一個執行緒。

IntentService面試題

1、IntentService是什麼

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

2、IntentService使用方法

  • 建立Service繼承自IntentService
  • 覆寫構造方法和onHandlerIntent()方法
  • 在onHandlerIntent()中執行耗時操作

學習分享,共勉

Android高階架構師進階之路

題外話,我在阿里工作多年,深知技術改革和創新的方向,Android開發以其美觀、快速、高效、開放等優勢迅速俘獲人心,但很多Android興趣愛好者所需的進階學習資料確實不太系統,完整。今天我把我搜集和整理的這份學習資料分享給有需要的人

  • Android進階知識體系學習腦圖
  • Android進階高階工程師學習全套手冊
  • 對標Android阿里P7,年薪50w+學習視訊
  • 大廠內部Android高頻面試題,以及面試經歷

本文已被CODING開源專案:《Android學習筆記總結+移動架構視訊+大廠面試真題+專案實戰原始碼》收錄