本文在 https://wkmcyz.notion.site/Android-e203f65b6c1c4022b053db6ce24570bd 閱讀體驗更好。
說說 Android 的桌面管理
Android 的桌面是由 WallpaperManagerService 進行管理的。下文中的 “管理服務” 指的即是 WallpaperManagerService 。
Android 上的桌面有靜态桌面和動态桌面之分,不過其啟動以及程序間的通信的原理和模式是一樣的,隻是實際的繪制不同而已,一個隻繪制一張圖,而另一個會根據時間繪制相同的内容。
💡 Android 沒有将 WallpaperManagerService 開放給第三方,是以普通應用無法設定桌面。
WallpaperManagerService 對桌面的管理
管理服務在切換桌面的時候,每次切換的時候,并不是指定一個圖檔檔案就可以進行切換的,不同的桌面需要不同的類來完成其繪制,是以在切換桌面的時候,實際指定的是一個新的桌面繪制的工作類。
WallpaperManagerService 是運作在 system_server 裡的,作為一個對外的接口和管理者。有些應用需要設定桌面的時候(比如說“設定”、“桌面”這類系統應用),就會獲得 WallpaperManagerService 進行桌面的設定。
裝置上可能有多個不同種類的桌面管理器,每個分别負責一個種類的桌面,每種桌面實際切換的邏輯以及具體的繪制都是在其内部進行的,WallpaperManagerService 隻是在适當的時機切換目前正在運作的桌面管理器(比如靜态桌面切換成動态桌面),或者是通知目前的桌面管理器切換一下桌面(比如說換個圖檔桌面)。
💡 桌面管理器是怎麼繪制桌面到螢幕上的?
WallpaperManagerService 會給桌面管理者提供 Window,這個 window 就是桌面的 window,在其上繪制,就相當于是繪制了桌面的内容。
而這個 window ,是 WindowManagerService 特殊标記的視窗,在進行布局的時候會有适當的調整,以使得其總是在螢幕可見内容的下面的,看起來是“桌面”一樣。
💡 桌面實際的繪制者是誰?和 WallpaperManagerService 什麼關系?
桌面最基本的劃分是一張桌面,就比如日常在手機上設定的桌面的圖檔選擇。在此基礎之上,WallpapaerManagerService 規定了一個桌面的種類分組,這個種類是可以擴充的,比如說動态桌面、靜态桌面、或者我們自己實作的一個根據目前時間展示圖檔的不同區域的桌面等。而每個桌面種類都對應了一個統一的分發處理類。
WallpapaerManagerService 在切換一個桌面的時候,會先和一個 WallpaperService 建立雙向的聯系,這個 WallpaperService 是一種桌面的管理器,對于其管理的桌面,每次更換的時候,都會給出一個Engine。
- Engine 才是實際繪制桌面的類。比如說選擇了圖檔作為靜态桌面展示的時候,對應的 Engine 會将圖檔繪制到視窗上;動态桌面則會根據目前的時間将動态幀繪制到視窗上。
- WallpaperService 更換要展示的桌面的時候,并不是複用前面的 Engine 對象,而是會建立一個 Engine 對象,之前的會被廢棄掉。這樣雖然不複用了,但是友善清理配置設定的對象。
開發者在開發的時候,可以做些什麼?
因為設定桌面管理器隻有有系統權限的應用才能設定,是以我們不能自己開發一個特殊的桌面管理器然後使用。開發自定義的桌面管理器的話,最多的使用場景就是在開發自己的 Android 作業系統的時候使用。比如可以開發一個特殊的桌面展示,例如開發一個會根據目前時間展示不同光照方向的桌面管理器。
不過普通應用是具有設定桌面的權限的,可以通過 WallpaperManager 進行靜态桌面的設定。
相關類
- WallpaperManagerService
- ImageWallpaper
- WallpaperManager
- WallpaperService
- Engine