Android系統(tǒng)服務(wù):WMS、AMS相關(guān)知識(shí)

導(dǎo)讀

簡介

可以說Android的framework層主要是由AMS、WMS、View所構(gòu)成,這三個(gè)模塊穿插交互在整個(gè)framework中,本編文章作為初步學(xué)習(xí)的筆記。

Activity與WIndow
Activity只負(fù)責(zé)生命周期和事件處理
Window只控制視圖
一個(gè)Activity包含一個(gè)Window,如果Activity沒有Window,那就相當(dāng)于Service

AMS與WMS
AMS統(tǒng)一調(diào)度所有應(yīng)用程序的Activity
WMS控制所有Window的顯示與隱藏以及要顯示的位置

AMS(activity manaer service):

AMS是Android中最核心的服務(wù),主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊相類似,因此它在Android中非常重要。

作用

  • 統(tǒng)一調(diào)度所有應(yīng)用程序的Activity的生命周期
  • 啟動(dòng)或殺死應(yīng)用程序的進(jìn)程
  • 啟動(dòng)并調(diào)度Service的生命周期
  • 注冊(cè)BroadcastReceiver,并接收和分發(fā)Broadcast
  • 啟動(dòng)并發(fā)布ContentProvider
  • 調(diào)度task
  • 處理應(yīng)用程序的Crash
  • 查詢系統(tǒng)當(dāng)前運(yùn)行狀態(tài)

代理模式

WMS(window manager service)

WindowManagerService服務(wù)的實(shí)現(xiàn)是相當(dāng)復(fù)雜的,畢竟它要管理的整個(gè)系統(tǒng)所有窗口的UI,而在任何一個(gè)系統(tǒng)中,窗口管理子系統(tǒng)都是極其復(fù)雜的。(控制所有的window的顯示、隱藏及要顯示的問題。)
作用:

  • 為所有窗口分配Surface。客戶端向WMS添加一個(gè)窗口的過程,其實(shí)就是WMS為其分配一塊Surface的過程,一塊塊Surface在WMS的管理下有序的排布在屏幕上。Window的本質(zhì)就是Surface。
  • 管理Surface的顯示順序、尺寸、位置
  • 管理窗口動(dòng)畫
  • 輸入系統(tǒng)相關(guān):WMS是派發(fā)系統(tǒng)按鍵和觸摸消息的最佳人選,當(dāng)接收到一個(gè)觸摸事件,它需要尋找一個(gè)最合適的窗口來處理消息,而WMS是窗口的管理者,系統(tǒng)中所有的窗口狀態(tài)和信息都在其掌握之中,完成這一工作不在話下。

橋接模式

什么是Window

“Window即窗口的意思,窗口是一個(gè)抽象的概念,從用戶的角度來講,它是一個(gè)界面;從SurfaceFlinger的角度來看,它是一個(gè)Layer,承載著和界面有關(guān)的數(shù)據(jù)和屬性;從WMS角度來看,它是一個(gè)WIndowState,用于管理和界面有關(guān)的狀態(tài)。

在《深入理解Android內(nèi)核設(shè)計(jì)思想》一書中看到一個(gè)比喻非常好,整個(gè)界面就像由N個(gè)演員參與的話劇:SurfaceFling是攝像機(jī),它只負(fù)責(zé)客觀的捕捉當(dāng)前的畫面,然后真實(shí)的呈現(xiàn)給觀眾;WMS就是導(dǎo)演,它要負(fù)責(zé)話劇的舞臺(tái)效果、演員站位;ViewRoot就是各個(gè)演員的長相和表情,取決于它們各自的條件與努力。可見,WMS與SurfaceFling的一個(gè)重要區(qū)別就是——后者只做與“顯示”相關(guān)的事情,而WMS要處理對(duì)輸入事件的派發(fā)。

Android支持的窗口類型很多,統(tǒng)一可以分為三大類,另外各個(gè)種類下還細(xì)分為若干子類型,且都在WindowManager.java中有定義。

  • Application Window
  • SystemWindow
  • Sub Window

View

工作流程

AMS的工作流程,其實(shí)就是Activity的啟動(dòng)和調(diào)度的過程,所有的啟動(dòng)方式,最終都是通過Binder機(jī)制的Client端,調(diào)用Server端的AMS的startActivityXXX()系列方法。所以可見,工作流程又包括Client端和Server端兩個(gè)。

Client端流程

Launcher主線程捕獲onClick()點(diǎn)擊事件后,調(diào)用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()內(nèi)部調(diào)用了Launcher.startActivity()方法,Launcher.startActivity()內(nèi)部調(diào)用了Launcher的父類Activity的startActivity()方法。
Activity.startActivity()調(diào)用Activity.startActivityForResult()方法,傳入該方法的requestCode參數(shù)若為-1,則表示Activity啟動(dòng)成功后,不需要執(zhí)行Launcher.onActivityResult()方法處理返回結(jié)果。
啟動(dòng)Activity需要與系統(tǒng)ActivityManagerService交互,必須納入Instrumentation(檢測(cè),插裝)的監(jiān)控,因此需要將啟動(dòng)請(qǐng)求轉(zhuǎn)交instrumentation,即調(diào)用Instrumentation.execStartActivity()方法。
Instrumentation.execStartActivity()首先通過ActivityMonitor檢查啟動(dòng)請(qǐng)求,然后調(diào)用ActivityManagerNative.getDefault()得到ActivityManagerProxy代理對(duì)象,進(jìn)而調(diào)用該代理對(duì)象的startActivity()方法。
ActivityManagerProxy是ActivityManagerService的代理對(duì)象,因此其內(nèi)部存儲(chǔ)的是BinderProxy,調(diào)用ActivityManagerProxy.startActivity()實(shí)質(zhì)是調(diào)用BinderProxy.transact()向Binder驅(qū)動(dòng)發(fā)送START_ACTIVITY_TRANSACTION命令。Binder驅(qū)動(dòng)將處理邏輯從Launcher所在進(jìn)程切換到ActivityManagerService所在進(jìn)程。
Server端流程

啟動(dòng)Activity的請(qǐng)求從Client端傳遞給Server端后,便進(jìn)入了啟動(dòng)應(yīng)用的七個(gè)階段,這里也是整理出具體流程

預(yù)啟動(dòng)

ActivityManagerService.startActivity()
ActivityStack.startActivityMayWait()
ActivityStack.startActivityLocked()
ActivityStack.startActivityUncheckedLocked()
ActivityStack.startActivityLocked()(重載)
ActivityStack.resumeTopActivityLocked()
暫停

ActivityStack.startPausingLocked()
ApplicationThreadProxy.schedulePauseActivity()
ActivityThread.handlePauseActivity()
ActivityThread.performPauseActivity()
ActivityManagerProxy.activityPaused()
completePausedLocked()
啟動(dòng)應(yīng)用程序進(jìn)程

第二次進(jìn)入ActivityStack.resumeTopActivityLocked()
ActivityStack.startSpecificActivityLocked()
startProcessLocked()
startProcessLocked()(重載)
Process.start()
加載應(yīng)用程序Activity

ActivityThread.main()
ActivityThread.attach()
ActivityManagerService.attachApplication()
ApplicationThread.bindApplication()
ActivityThread.handleBindApplication()
顯示Activity

ActivityStack.realStartActivityLocked()
ApplicationThread.scheduleLaunchActivity()
ActivityThead.handleLaunchActivity()
ActivityThread.performLaunchActivity()
ActivityThread.handleResumeActivity()
ActivityThread.performResumeActivity()
Activity.performResume()
ActivityStack.completeResumeLocked()

停止源Activity

ActivityStack.stopActivityLocked()
ApplicationThreadProxy.scheduleStopActivity()
ActivityThread.handleStopActivity()
ActivityThread.performStopActivityInner()

參考文獻(xiàn)
Android窗口管理服務(wù)WindowManagerService計(jì)算Activity窗口大小的過程分析
Android窗口管理服務(wù)WindowManagerService顯示Activity組件的啟動(dòng)窗口(Starting Window)的過程分析
Android窗口管理服務(wù)WindowManagerService對(duì)輸入法窗口(Input Method Window)的管理分析
Android窗口管理服務(wù)WindowManagerService顯示窗口動(dòng)畫的原理分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容