優化后文章結構:
1. 前言
強調鎖屏通知布局的重要性及分析目的,引出后續源碼分析的必要性。
2. 核心類解析
-
KeyguardViewMediator:鎖屏核心邏輯控制,處理亮屏/息屏事件分發。
-
PhoneWindowManager:系統輸入事件(如電源鍵)的入口,觸發屏幕狀態切換。
-
KeyguardServiceDelegate:橋接系統服務與Keyguard核心邏輯,代理關鍵生命周期回調。
3. 核心流程分析
3.1 電源鍵亮屏事件入口
PhoneWindowManager.screenTurningOn()
-
調用
mKeyguardDelegate.onScreenTurningOn()
通知鎖屏服務進入亮屏流程。 -
若存在鎖屏界面,發送
MSG_KEYGUARD_DRAWN_TIMEOUT
超時檢測消息,確保界面繪制完成。
java
復制
// 代碼片段:PhoneWindowManager.screenTurningOn() if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) {mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, getKeyguardDrawnTimeout());mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback); // 關鍵調用 }
3.2 鎖屏服務響應亮屏
KeyguardServiceDelegate.onScreenTurningOn()
-
通過IPC調用
KeyguardService.onScreenTurningOn()
,傳遞KeyguardShowDelegate
監聽繪制完成。 -
若服務未連接,緩存監聽器等待后續重試。
java
復制
// 代碼片段:KeyguardServiceDelegate.onScreenTurningOn() mKeyguardService.onScreenTurningOn(new KeyguardShowDelegate(drawnListener)); mKeyguardState.screenState = SCREEN_STATE_TURNING_ON; // 更新屏幕狀態
3.3 鎖屏界面繪制與通知
KeyguardViewMediator.handleNotifyScreenTurningOn()
-
觸發
mStatusBarKeyguardViewManager.onScreenTurningOn()
更新狀態欄鎖屏視圖。 -
若處于“Wake-and-Unlock”模式(如人臉解鎖),延遲回調
notifyDrawn()
;否則立即通知繪制完成。
java
復制
// 代碼片段:handleNotifyScreenTurningOn() mStatusBarKeyguardViewManager.onScreenTurningOn(); if (callback != null) {if (mWakeAndUnlocking) {mDrawnCallback = callback; // 延遲回調} else {notifyDrawn(callback); // 立即通知} }
3.4 鎖屏通知布局渲染完成
KeyguardShowDelegate.notifyDrawn()
-
通過
IKeyguardDrawnCallback
跨進程回調,通知PhoneWindowManager
鎖屏界面已繪制完畢。 -
觸發
mHandler.sendMessage(MSG_KEYGUARD_DRAWN_COMPLETE)
,結束超時檢測,完成亮屏流程。
4. 鎖屏通知布局的自定義擴展
實現思路:
-
修改鎖屏通知容器:
-
定位
StatusBarKeyguardViewManager
中鎖屏布局的初始化邏輯,替換自定義視圖。 -
示例:重寫
onScreenTurningOn()
時注入自定義NotificationPanelView
。
-
-
控制通知顯示策略:
-
修改
NotificationController
中與鎖屏相關的邏輯,如shouldShowOnKeyguard()
方法控制通知過濾。
-
-
處理亮屏動畫銜接:
-
在
KeyguardViewMediator.handleNotifyScreenTurningOn()
中插入自定義動畫,確保與系統過渡效果協調。
-
5. 總結
通過分析亮屏事件傳遞鏈,理解鎖屏通知布局的顯示時機與控制點,為定制化開發(如沉浸式通知、動態布局調整)提供理論基礎。
關鍵流程圖解
plaintext
復制
電源鍵按下 → PhoneWindowManager.screenTurningOn() → KeyguardServiceDelegate.onScreenTurningOn() → KeyguardService.onScreenTurningOn() → KeyguardViewMediator.notifyScreenOn() → Handler發送NOTIFY_SCREEN_TURNING_ON消息 → handleNotifyScreenTurningOn() → StatusBarKeyguardViewManager更新UI → 通知繪制完成 → 系統完成亮屏
通過以上結構,讀者可清晰理解鎖屏通知布局的亮屏流程,并結合實際需求進行定制開發
轉載請注明出處《深度剖析Android 12 SystemUI鎖屏通知布局亮屏流程:從源碼到實現》-CSDN博客,謝謝!