實戰多屏Wallpaper壁紙顯示及出現黑屏問題bug分析-學員作業

背景:

在大家看了上一篇google官方對于多屏壁紙這塊的介紹后

安卓Wallpaper壁紙部分對多屏的支持-Google官方文檔介紹

可能還是對于壁紙支持多屏這塊沒有相關的實戰性的認知,所以本文就開始帶大家來進行部分解讀和實戰。

壁紙多屏顯示原理文檔解讀:

原文:
開發者可以通過在 WallpaperInfo XML 定義中提供 android:supportsMultipleDisplays=“true” 來聲明對壁紙功能的支持。壁紙開發者還可以使用 WallpaperService.Engine#getDisplayContext() 中的顯示上下文來加載素材資源。
框架會為每個屏幕創建一個 WallpaperService.Engine 實例,因此每個引擎都有自己的 surface 和顯示上下文。開發者需要確保每個引擎都能夠根據 VSYNC 以不同的幀頻獨立繪制。

上面這段說明可以得出以下幾點:
1、在自定義動態壁紙時候,是有單獨的xml可以來配置壁紙相關屬性,可以通過
android:supportsMultipleDisplays=“true” 這個屬性來告訴系統當前壁紙是支持多屏顯示的

那么自定義壁紙又是如何識別當前運行于哪個屏幕?然后針對不同的屏幕繪制不同的資源和內容呢?

2、因為自定義壁紙本身就是繼承WallpaperService重寫一個壁紙服務,每個服務可以通過WallpaperService.Engine#getDisplayContext() 方法獲取到自己在不同的屏幕,簡單說就是WallpaperService有自己context,可以通過context獲取到自己的Display,也就是多個屏幕會有多個WallpaperService而且Service中可以識別自己對應的display,這樣就可以差異識別。

比如看看自定義壁紙中繪制可以繪制自己的DisplayID來作為區分
在這里插入圖片描述
那么真的就像官方文檔中說的那么順利么?

作業準備:

源碼環境:aosp15測試,預計aosp14,aosp13應該也一樣可以

第一步

首先得準備一個自定義的動態壁紙,具體大家可以直接源碼中尋找demo拿來用也可以,源碼位置:

動態壁紙參考案例1

aosp源碼路徑

development/samples/CubeLiveWallpaper

動態壁紙參考案例2

aosp源碼路徑

development/samples/MultiDisplay

第二步

拿到demo后大家記得要按照官方要求進行配置:
按照上面google官方文檔說的
壁紙支持多屏顯示最核心的步驟就是在如下xml中加上android:supportsMultipleDisplays="true"的屬性

<?xml version="1.0" encoding="UTF-8"?><wallpaperxmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/wallpaper_description"android:supportsMultipleDisplays="true"/>

ps:如果不設置android:supportsMultipleDisplays=“true”,那么在多屏情況下設置壁紙會如何呢?
在這里插入圖片描述主屏幕 顯示正常自定義壁紙,副屏慕顯示原生靜態壁紙

發現結果就是主屏幕顯示動態壁紙,但是副屏幕顯示靜態壁紙。

AndroidManifest.xml中聲明這個Service是屬于WallpaperService的

<serviceandroid:name=".wallpaper.SampleWallpaper"android:permission="android.permission.BIND_WALLPAPER"android:exported="true"><intent-filter><action android:name="android.service.wallpaper.WallpaperService"></action></intent-filter><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/wallpaper"></meta-data>
</service>

上面代碼準備好以后既可以開始編譯,安裝運行驗證效果了。

第三步

編譯好自定義壁紙apk,然后進行adb install這個apk

mmm development/samples/MultiDisplay/adb install -r out/target/product/emu64x/system/app/MultiDisplay/MultiDisplay.apk

第四步
桌面設置自定義壁紙操作部分:
桌面長按點擊出現壁紙相關設置按鈕
在這里插入圖片描述
點擊后進行選著壁紙畫面,這里最好建立多安幾個自定義壁紙

在這里插入圖片描述

選擇我們自己寫壁紙服務進行設置成壁紙
在這里插入圖片描述

第四步

查看設置的壁紙運行現象,運行設置動態壁紙后出現如下現象:

在這里插入圖片描述
明顯發現主屏幕正常顯示自定義壁紙,但是副屏顯示為黑屏。那么到底為啥黑屏呢?這部分就是留給各位學員朋友的課程作業啦。

作業要求:

1、剖析出android:supportsMultipleDisplays="true"的原理

2、根據上面作業步驟,復現出設置自定義壁紙后,主屏正常副屏黑屏現象

3、分析黑屏現象的初步原因

4、深入追蹤分析出黑屏的根本原因,并考慮相關的修復方案

5、盡量修復方案不要考慮修改系統framework框架代碼,可以自己自定義壁紙的app來解決

更多framework實戰開發干貨,請關注下面“千里馬學框架”

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

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

相關文章

Vue插槽---slot詳解

1、什么是 Vue 插槽&#xff1f;Vue 插槽&#xff08;Slot&#xff09;?? 是 Vue 提供的一種非常強大且靈活的機制&#xff0c;用于實現&#xff1a;父組件向子組件傳遞一段模板內容&#xff08;HTML / 組件等&#xff09;&#xff0c;讓子組件在指定位置動態渲染這些內容。可…

STM32 - Embedded IDE - GCC - 顯著減少固件的體積

導言如上圖所示&#xff0c;在編譯器附加選項&#xff08;全局&#xff09;里添加--specsnano.specs&#xff0c;告訴編譯器使用newlib-nano替代newlib去編譯代碼。 newlib vs. newlib-nano newlib 是 GNU ARM 工具鏈默認的 C 標準庫&#xff0c;功能完整&#xff0c;但體積較大…

python的美食交流社區系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 摘要&…

《Redis持久化機制對比與RDB/AOF調優方案》

&#x1f4da; Redis持久化機制對比與RDB/AOF調優方案 &#x1f9e0;前言 在生產環境中&#xff0c;Redis 常常被用作緩存&#xff0c;但在更多場景下&#xff0c;它還存儲著核心業務數據&#xff08;如會話、訂單、隊列任務等&#xff09;。一旦 Redis 宕機、數據丟失&#…

eXtremeDB 醫療設備開發實戰:從合規到實時,構建 EN62304 級數據管理系統

在醫療設備開發領域&#xff0c;數據管理的 “可靠性” 與 “合規性” 是不可逾越的紅線 —— 監護儀心率數據的丟失可能延誤診斷時機&#xff0c;胰島素泵劑量記錄的錯誤則直接威脅患者生命安全。eXtremeDB 憑借對 EN62304 標準的深度合規支持、硬實時數據處理能力及多層次安全…

linux 設備驅動的分層思想

一、 概述像這樣的分層設計在linux的input、RTC、MTD、I2c、SPI、tty、USB等諸多類型設備驅動中屢見不鮮,下面對這些驅動進行詳細的分析。二、 輸入設備驅動輸入設備&#xff08;如按鍵、鍵盤、觸摸屏、鼠標等&#xff09;是典型的字符設備&#xff0c;其一般的工…

【嵌入式硬件實例】-555定時器驅動直流無刷電機

555定時器驅動直流無刷電機 文章目錄 555定時器驅動直流無刷電機 1、555定時器介紹 2、BLDC,無刷直流電機 3、DRV10866 驅動器 4、硬件準備與接線 5、電路工作原理 在這個項目中,我們將使用 555 定時器 IC 和 DRV10866 驅動器 IC 制作 BLDC、無刷直流電機驅動電路。無刷電機可…

Helm 常用命令 + Bitnami 中間件部署速查表

文章目錄一、Helm 常用命令速查表1.1. 倉庫管理1.2. Chart 搜索1.3. 應用部署1.4. 應用管理二、Bitnami 常用中間件部署示例三、常用自定義參數&#xff08;values.yaml 配置項&#xff09;四、安裝后的訪問方式五、一鍵安裝腳本 install-middleware.sh5.1. 完整腳本5.2. 使用方…

Ansible 自動化運維實戰系列(六):Valut詳解

Ansible 自動化運維實戰系列&#xff08;六&#xff09;&#xff1a;Valut詳解&#x1f4da; 系列導航一&#xff1a;概述二&#xff1a;命令1&#xff09;創建加密文件2&#xff09;加密已有文件3&#xff09;查看加密文件4&#xff09;編輯加密文件5&#xff09;解密文件6&am…

《探秘瀏覽器Web Bluetooth API設備發現流程》

網頁若需與藍牙設備通信,往往需依賴本地客戶端或專用驅動程序作為中介,不僅增加了用戶操作成本,也限制了Web應用在跨設備場景中的拓展。而Web Bluetooth API的出現,直接賦予了網頁與低功耗藍牙(BLE)設備對話的能力,從智能手環的健康數據同步,到智能家居設備的遠程控制,…

Jenkins+Python自動化持續集成詳細教程

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;Jenkins安裝 ? Jenkins是一個開源的軟件項目&#xff0c;是基于java開發的一種持續集成工具&#xff0c;用于監控持續重復的工作&#xff0c;旨在提供一個開放易用的軟件平臺&#xff0c;使軟件的持續…

C++面試——內存

一、簡述堆和棧的區別維度棧&#xff08;Stack&#xff09;堆&#xff08;Heap&#xff09;生命周期隨函數調用自動創建/銷毀由程序員或垃圾回收器控制分配速度極快&#xff08;僅移動指針&#xff09;慢&#xff08;需查找空閑塊、維護元數據&#xff09;空間大小較小&#xf…

UVM驗證(三)—UVM機制(1)

目錄 &#xff08;一&#xff09;Factory工廠機制 1. 工廠機制核心邏輯&#xff1a;“注冊 - 創建 - 覆蓋” 2. 代碼映射&#xff1a;從概念到實現 3. 實驗目標&#xff1a;用 dadd_fixen_driver 固定 data_en1 4. 工廠機制的價值&#xff1a;“靈活驗證的基石” 5. 常見…

前往中世紀 送修改器(Going Medieval)免安裝中文版

網盤鏈接&#xff1a; 前往中世紀 免安裝中文版 名稱&#xff1a;前往中世紀 送修改器&#xff08;Going Medieval&#xff09;免安裝中文版 描述&#xff1a; 在Going Medieval的世界中&#xff0c;黑暗時代的社會已瀕臨崩潰。14世紀末瘟疫肆虐&#xff0c;全球95%的人口因…

Font Awesome 參考手冊

Font Awesome 參考手冊 引言 Font Awesome 是一個功能強大的圖標庫,它允許開發者通過簡單的 CSS 類來添加圖標到網頁中。本手冊旨在為開發者提供全面的 Font Awesome 使用指南,包括圖標選擇、樣式定制以及常見問題解答。 圖標選擇 圖標分類 Font Awesome 提供了多種類別…

源網荷儲一體化零碳智慧工業園區建設

針對傳統工業園區等電力消納大戶存在的供電模式單一、能源管理錯雜、園區人員設備安全統籌不到位等諸多問題&#xff0c;通過AI分析及物聯網等新技術和自研交直流關鍵設備的應用&#xff0c;在三維場景中構建集智慧能源、智慧安防、碳排放管理及智慧運營等功能于一體的新型零碳…

MySQL表操作(DDL)

MySQL表操作創建表查看表結構修改表結構增加一列刪除一列修改某一列的屬性修改某一列的名字修改某一列的屬性和名字插入幾條信息刪除表創建表 語法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collat…

【總結】Python多線程

【總結】Python多線程備注一、基本概念二、備注 2025/08/15 星期五 最近用到了python的多線程發現和其他語言有點不同記錄一下 一、基本概念 首先要理解一下線程、進程和協程的概念 線程&#xff08;Thread&#xff09;&#xff1a;是計算機能夠調度的最小計算單位 進程&…

【c++深入系列】:萬字詳解模版(下)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 成功沒有標準答案&#xff0c;但堅持永遠是必選項 ★★★ 本文前置知識&#xff1a; 模版(上&#xff09; 那么在之前的文章中我們展示…

Docker部署美化SunPanel導航頁

使用Cloudflare Tunnels穿透的地址:星霜導航 由于是使用的iStore里面的SunPanel導航頁,只是基本的功能 頁腳配置 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" conte…