Android中surface、suafaceview、surfaceflinger、view、activity的區(qū)別與聯(lián)系

一、核心概念拆解(區(qū)別)

先逐個明確每個組件的本質(zhì)和核心作用,幫你建立基礎(chǔ)認(rèn)知:

1. Activity

  • 本質(zhì):Android 四大組件之一,是用戶與應(yīng)用交互的界面載體,負(fù)責(zé)管理界面的生命周期(onCreate、onResume 等),也是 View 樹的 “容器管理者”。
  • 核心作用:
    提供一個窗口(Window),所有可見的 View/SurfaceView 都依附在這個窗口上;
    處理用戶交互(如點擊、返回),管理頁面的啟動、暫停、銷毀等狀態(tài);
    本身不負(fù)責(zé)渲染,只是 “界面的管理者”。

2. View

  • 本質(zhì):所有可視化控件(Button、TextView、LinearLayout 等)的基類,是普通 UI 組件的抽象。
  • 核心作用:
    負(fù)責(zé)繪制自身(通過 onDraw(Canvas) 方法)、處理觸摸事件;
    所有 View 組成一棵 “View 樹”,由 ViewRootImpl 統(tǒng)一管理,渲染在 Activity 窗口的主畫布上;
    渲染特點:運行在主線程(UI 線程),如果繪制耗時(如復(fù)雜動畫)會導(dǎo)致界面卡頓,且所有 View 共享同一個繪制緩沖區(qū)。

3. Surface

  • 本質(zhì):一個繪圖緩沖區(qū)(Buffer)的抽象,可以理解為 “一塊可繪制的內(nèi)存區(qū)域”,存儲著要顯示的像素數(shù)據(jù)。
  • 核心作用:
    是圖形數(shù)據(jù)的 “載體”,底層對應(yīng) GPU 或硬件的幀緩沖區(qū);
    不直接繪制,只是提供 “繪制的畫布”,需要結(jié)合 Canvas、OpenGL ES 等工具來繪制內(nèi)容;
    可以跨進程共享,是 SurfaceView 和 SurfaceFlinger 之間的 “數(shù)據(jù)橋梁”。

4. SurfaceView

  • 本質(zhì):View 的子類,但擁有獨立的 Surface(區(qū)別于普通 View 共享的主畫布)。
  • 核心作用:
    解決普通 View 主線程繪制卡頓的問題:SurfaceView 的繪制可以在子線程中進行,不占用主線程;
    適用于高頻繪制場景(如視頻播放、游戲、實時攝像頭預(yù)覽);
    它的視圖層級是 “獨立” 的:普通 View 繪制在 Activity 的主 Surface 上,而 SurfaceView 的內(nèi)容會被繪制在單獨的層上,甚至可以在普通 View 之下 / 之上。

5. SurfaceFlinger

  • 本質(zhì):Android 系統(tǒng)的核心服務(wù)(System Service),運行在系統(tǒng)進程,是圖形渲染的 “總指揮”。
  • 核心作用:
    接收所有應(yīng)用的 Surface 數(shù)據(jù)(包括 Activity 的主 Surface、SurfaceView 的獨立 Surface、狀態(tài)欄 / 導(dǎo)航欄的 Surface 等);
    將這些 Surface 按照 “Z 軸層級”(比如導(dǎo)航欄在最上層,應(yīng)用界面在中間,壁紙在最下層)合成一幀圖像;
    把合成后的圖像發(fā)送到屏幕顯示(通過硬件抽象層 HAL 與屏幕驅(qū)動交互)。

二、核心關(guān)聯(lián)(聯(lián)系)

用一個 “渲染流程” 串聯(lián)所有組件,你就能清晰看到它們的協(xié)作關(guān)系:


image.png

具體協(xié)作步驟:

  • Activity 啟動:Activity 被系統(tǒng)創(chuàng)建后,會創(chuàng)建一個 Window(窗口),Window 是 View 的 “容器”,同時會初始化 ViewRootImpl。
  • 普通 View 渲染:
    你在 Activity 的 onCreate 中通過 setContentView 加載布局,布局中的所有 View 組成 View 樹;
    ViewRootImpl 會為這個 Activity 窗口創(chuàng)建一個主 Surface,所有普通 View 的 onDraw 方法最終都會把繪制內(nèi)容寫入這個主 Surface;
  • SurfaceView 渲染:
    如果你在布局中使用了 SurfaceView,它會在 Activity 窗口中申請一個獨立的 Surface(不占用主 Surface);
    你可以通過 SurfaceView 的 SurfaceHolder 獲取這個獨立 Surface,在子線程中通過 Canvas 或 OpenGL ES 向其中繪制內(nèi)容(比如實時攝像頭數(shù)據(jù));
  • SurfaceFlinger 合成:
    主 Surface(普通 View)、SurfaceView 的獨立 Surface、系統(tǒng)狀態(tài)欄 / 導(dǎo)航欄的 Surface 都會被提交到 SurfaceFlinger;
    SurfaceFlinger 按照預(yù)設(shè)的 Z 軸層級(比如 SurfaceView 可以設(shè)置在普通 View 之上)將這些 Surface 合成一幀;
    屏幕顯示:SurfaceFlinger 將合成后的幀數(shù)據(jù)發(fā)送到屏幕驅(qū)動,最終顯示在用戶面前。

三、關(guān)鍵對比(易混點)

組件 核心定位 線程模型 所屬層級
Activity 界面管理者 主線程 應(yīng)用層(APP)
View 普通 UI 繪制單元 主線程 應(yīng)用層(APP)
Surface 繪圖緩沖區(qū)抽象 無(只是數(shù)據(jù)載體) 框架層(Framework)
SurfaceView 獨立繪制的 View 子類 可在子線程繪制 應(yīng)用層(APP)
SurfaceFlinger 系統(tǒng)合成服務(wù) 系統(tǒng)線程 系統(tǒng)層(System)

總結(jié)

  1. 核心分工:Activity 是 “界面管理者”,View/SurfaceView 是 “繪制執(zhí)行者”,Surface 是 “繪制數(shù)據(jù)載體”,SurfaceFlinger 是 “系統(tǒng)合成總指揮”。
  2. 核心關(guān)聯(lián):所有可見的繪制內(nèi)容最終都會通過 Surface 傳遞給 SurfaceFlinger,由它合成后顯示到屏幕;Activity 是所有 View/SurfaceView 的 “宿主”,管理它們的生命周期。
  3. 核心區(qū)別:普通 View 共享 Activity 的主 Surface 且在主線程繪制,SurfaceView 擁有獨立 Surface 且可在子線程繪制;SurfaceFlinger 是系統(tǒng)級服務(wù),負(fù)責(zé)所有 Surface 的最終合成。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容