《深度剖析Android 12 SystemUI鎖屏通知布局亮屏流程:從源碼到實現》

優化后文章結構:

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. 鎖屏通知布局的自定義擴展

實現思路

  1. 修改鎖屏通知容器

    • 定位StatusBarKeyguardViewManager中鎖屏布局的初始化邏輯,替換自定義視圖。

    • 示例:重寫onScreenTurningOn()時注入自定義NotificationPanelView

  2. 控制通知顯示策略

    • 修改NotificationController中與鎖屏相關的邏輯,如shouldShowOnKeyguard()方法控制通知過濾。

  3. 處理亮屏動畫銜接

    • KeyguardViewMediator.handleNotifyScreenTurningOn()中插入自定義動畫,確保與系統過渡效果協調。

5. 總結

通過分析亮屏事件傳遞鏈,理解鎖屏通知布局的顯示時機與控制點,為定制化開發(如沉浸式通知、動態布局調整)提供理論基礎。


關鍵流程圖解

plaintext

復制

電源鍵按下 → PhoneWindowManager.screenTurningOn()  → KeyguardServiceDelegate.onScreenTurningOn()  → KeyguardService.onScreenTurningOn()  → KeyguardViewMediator.notifyScreenOn()  → Handler發送NOTIFY_SCREEN_TURNING_ON消息  → handleNotifyScreenTurningOn()  → StatusBarKeyguardViewManager更新UI  → 通知繪制完成 → 系統完成亮屏

通過以上結構,讀者可清晰理解鎖屏通知布局的亮屏流程,并結合實際需求進行定制開發

轉載請注明出處《深度剖析Android 12 SystemUI鎖屏通知布局亮屏流程:從源碼到實現》-CSDN博客,謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74696.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android系統的安全問題 - Android的keymaster和gatekeeper

Android 的 Keymaster 和 Gatekeeper 是兩大關鍵安全組件,分別負責硬件級別的密鑰管理和設備解鎖認證。它們在 Android 的安全架構中扮演重要角色,尤其在支持 硬件級安全特性(如可信執行環境 TEE 或專用安全芯片)的設備上。以下是它們的詳細對比和功能解析: 1. Keymaster(…

springBoot中雪花算術法

在 Spring Boot 中,雪花算法(Snowflake Algorithm)通常指的是 Twitter 開發的一種分布式唯一 ID 生成算法。它被廣泛用于分布式系統中生成全局唯一的 ID,尤其是在高并發場景下。雪花算法生成的 ID 是一個 64 位的長整型數字&#…

鴻蒙開發之ArkTS聯合類型

在鴻蒙開發中,ArkTS是一種基于TypeScript的編程語言,專為鴻蒙應用開發而設計。聯合類型(Union Types)在ArkTS中是一個重要的概念,它允許一個變量存儲多種類型的數據,從而增加了代碼的靈活性,同時…

K8S學習之基礎五十五:k8s中jenkins部署blueOcean

jenkins部署blueOcean 安裝插件 BLUE OCEAN 之后會多出一個菜單,可以更詳細方便的查看pipeline流程

DeepSeek概述

一、DeepSeek概述 1.1 DeepSeek是什么 DeepSeek是一家專注 通用人工智能(AGI,Artificial General Intelligence)的中國科技公司,主攻大數據研發與應用。DeepSeek-R1是其開源的推理模型,擅長處理復雜任務且可免費商用…

學習記錄(14):iOS部署

時隔多年后,再次部署開發iOS😁😁 1. Unity端設置,在此不再進行贅述(網上一大堆) 2. ??:要保證mac比待部署的設備版本要高 3. Xcode: (1) 打開從 Unity 3D 里打包的文件中,找到有…

如何使用DeepSeek編寫測試用例?

一、DeepSeek在測試用例設計中的定位 DeepSeek作為AI工具,并非直接替代測試設計,而是通過以下方式提升效率: 快速生成基礎用例框架(等價類、邊界值等) 智能補充易遺漏場景(如特殊字符、異常流) 自動化腳本片段生成(Python/pytest/JUnit等) 測試數據構造建議(符合業務…

9.4分漏洞!Next.js Middleware鑒權繞過漏洞安全風險通告

今日,亞信安全CERT監控到安全社區研究人員發布安全通告,Next.js 存在一個授權繞過漏洞,編號為 CVE-2025-29927。攻擊者可能通過發送精心構造的 x-middleware-subrequest 請求頭繞過中間件安全控制,從而在未授權的情況下訪問受保護…

【前端】原生項目與框架項目區別

不定期更新,建議關注收藏點贊。 使用 HTML CSS JS 和 Vue 或 React 開發的項目各有其優勢與不足,適用于不同的場景。目前基本上都采用框架, 總結 何時選擇 HTML CSS JS: 適用于 小型項目、簡單靜態頁面、不需要復雜交互 或 …

WinSCP使用教程:(SFTP、SCP、FTP 和 WebDAV)

WinSCP 是一款免費開源的 Windows 環境下的 SFTP、SCP、FTP 和 WebDAV 客戶端,主要用于在本地計算機與遠程服務器之間安全地傳輸文件,并提供基本的文件管理功能。 WinSCP是Windows環境下使用SSH的開源圖形化的SFTP的客戶端 SSH 的全稱是 Secure Shell&…

分布式鎖實戰:Redis與Redisson的深度解析

一、分布式鎖的必要性 在分布式系統中,當多個節點需要對共享資源進行讀寫操作時,傳統的本地鎖(如Java的synchronized或ReentrantLock)無法跨節點生效。此時,必須引入分布式鎖來保證操作的原子性和一致性。分布式鎖需滿…

Dify本地安裝部署筆記

目錄 方式一【docker安裝】: 步驟 1:準備工作 步驟2: 克隆dify倉庫 步驟3:部署啟動dify 步驟 4:訪問 Dify 步驟5:升級dify 方式二【源碼安裝】: 步驟1. 硬件:最低安裝要求 步驟2: 業務服務前的3個服務 1. 安…

質檢LIMS系統在食品生產加工企業的應用 如何保證食品生產企業的安全

在食品生產加工領域,質量安全是貫穿全產業鏈的生命線。隨著《食品安全法》對全過程追溯要求的深化,傳統實驗室管理模式已難以滿足高效、精準的質量管控需求。質檢實驗室信息管理系統(LIMS)作為數字化升級的核心工具,正…

自動駕駛VLA模型技術解析與模型設計

1.前言 2025年被稱為“VLA上車元年”,以視覺語言動作模型(Vision-Language-Action Model, VLA)為核心的技術范式正在重塑智能駕駛行業。VLA不僅融合了視覺語言模型(VLM)的感知能力和端到端模型的決策能力,…

UDP套接字編程(代碼)

什么是socket套接字編程? 通過Ip地址 端口號這種方式定位一臺主機,這樣的方式我們就叫做socket套接字。 Udp Socket 接口介紹 這些案列我們使用的接口基本都是一樣的,所以在這里我先把接口介紹完,具體的細節后面在說明。 創…

汽車行業可信數據空間研究探索

近期,相關老師在新能源汽車國家大數據聯盟微課堂發表了題為“汽車行業可信數據空間研究探索”的演講,主要包括可信數據空間的概念內涵、汽車行業可信數據空間的發展現狀、數據流通場景和技術需求研究、汽車行業可信數據空間的場景建設建議四個方面展開。…

圓弧插補相關算法匯總(C++和ST源代碼)

運動控制需要了解相關的插補概念,在閱讀本篇博客之前需要了解相關的準備知識,常用鏈接如下: SMART PLC直線插補詳解-CSDN博客文章瀏覽閱讀2.1k次,點贊2次,收藏4次。本文介紹了SMART PLC中軸組對象的概念,詳細講解了直線插補的原理和指令使用,包括SMART PLC從V2.7版本開…

Entity Framework框架

深入理解C#中的Entity Framework框架:從理論到實踐 在C#開發中,與數據庫交互是幾乎所有應用程序的核心需求之一。Entity Framework (EF) 作為微軟官方推出的ORM框架,極大地簡化了數據庫操作。本文將帶您深入理解EF框架的核心概念&#xff0c…

C++11QT復習 (五)

文章目錄 **Day6-2 成員訪問運算符重載(2025.03.25)****1. 復習****2. 成員訪問運算符重載****2.1 箭頭運算符 (->) 重載****(1) 語法** **2.2 解引用運算符 (*) 重載****(1) 語法** **3. 代碼分析****3.1 代碼結構****3.2 代碼解析****(1) Data 類**…

簡歷含金量的描述和注意事項!

背景 最近,在公司負責后端相關面試,簡歷看了不下 50 份,面試 10,純手碼 2000 多字,說說我對簡歷的看法,希望給大家一點啟發。 教育經歷 在眾多求職面試中,我發現多數求職者容易忽視教育背景的…