说说 Android 的壁纸管理

Android 的壁纸是由 WallpaperManagerService 进行管理的。下文中的 “管理服务” 指的即是 WallpaperManagerService 。

Android 上的壁纸有静态壁纸和动态壁纸之分,不过其启动以及进程间的通信的原理和模式是一样的,只是实际的绘制不同而已,一个只绘制一张图,而另一个会根据时间绘制相同的内容。

💡 Android 没有将 WallpaperManagerService 开放给第三方,因此普通应用无法设置壁纸。

WallpaperManagerService 对壁纸的管理

管理服务在切换壁纸的时候,每次切换的时候,并不是指定一个图片文件就可以进行切换的,不同的壁纸需要不同的类来完成其绘制,所以在切换壁纸的时候,实际指定的是一个新的壁纸绘制的工作类。

WallpaperManagerService 是运行在 system_server 里的,作为一个对外的接口和管理者。有些应用需要设置壁纸的时候(比如说“设置”、“壁纸”这类系统应用),就会获得 WallpaperManagerService 进行壁纸的设置。

设备上可能有多个不同种类的壁纸管理器,每个分别负责一个种类的壁纸,每种壁纸实际切换的逻辑以及具体的绘制都是在其内部进行的,WallpaperManagerService 只是在适当的时机切换当前正在运行的壁纸管理器(比如静态壁纸切换成动态壁纸),或者是通知当前的壁纸管理器切换一下壁纸(比如说换个图片壁纸)。

💡 壁纸管理器是怎么绘制壁纸到屏幕上的? WallpaperManagerService 会给壁纸管理者提供 Window,这个 window 就是壁纸的 window,在其上绘制,就相当于是绘制了壁纸的内容。 而这个 window ,是 WindowManagerService 特殊标记的窗口,在进行布局的时候会有适当的调整,以使得其总是在屏幕可见内容的下面的,看起来是“壁纸”一样。

壁纸最基本的划分是一张壁纸,就比如日常在手机上设置的壁纸的图片选择。在此基础之上,WallpapaerManagerService 规定了一个壁纸的种类分组,这个种类是可以扩展的,比如说动态壁纸、静态壁纸、或者我们自己实现的一个根据当前时间展示图片的不同区域的壁纸等。而每个壁纸种类都对应了一个统一的分发处理类。

WallpapaerManagerService 在切换一个壁纸的时候,会先和一个 WallpaperService 建立双向的联系,这个 WallpaperService 是一种壁纸的管理器,对于其管理的壁纸,每次更换的时候,都会给出一个Engine。

  • Engine 才是实际绘制壁纸的类。比如说选择了图片作为静态壁纸展示的时候,对应的 Engine 会将图片绘制到窗口上;动态壁纸则会根据当前的时间将动态帧绘制到窗口上。
  • WallpaperService 更换要展示的壁纸的时候,并不是复用前面的 Engine 对象,而是会新建一个 Engine 对象,之前的会被废弃掉。这样虽然不复用了,但是方便清理分配的对象。

android壁纸设置监听 手机壁纸 控制_复用

开发者在开发的时候,可以做些什么?

因为设置壁纸管理器只有有系统权限的应用才能设置,所以我们不能自己开发一个特殊的壁纸管理器然后使用。开发自定义的壁纸管理器的话,最多的使用场景就是在开发自己的 Android 操作系统的时候使用。比如可以开发一个特殊的壁纸展示,例如开发一个会根据当前时间展示不同光照方向的壁纸管理器。
不过普通应用是具有设置壁纸的权限的,可以通过 WallpaperManager 进行静态壁纸的设置。