背景:
在大家看了上一篇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實戰開發干貨,請關注下面“千里馬學框架”