启动动态壁纸可以通过调用WallpaperManager.getIWallpaperManager().setWallpaperComponent()方法完成。它接受一个ComponentName类型的参数,用于将希望启动的壁纸的WallpaperService的ComponentName告知WallpaperManagerService。WallpaperManager.getIWallpaperManager()方法返回的是WallpaperManagerService的Bp端。因此setWallpaperComponent()方法的实现位于WallpaperManagerService之中。参考其实现:
**WallpaperManagerService.java-->WallpaperManagerService.setWallpaperComponent()**
```
public void setWallpaperComponent(ComponentNamename) {
// 设置动态壁纸需要调用者拥有一个签名级的系统权限
checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
synchronized (mLock) {
/* **① 首先从mWallpaperMap中获取壁纸的运行信息WallpaperData。**
WallpaperManagerService支持多用户机制,因此设备上的每一个用户可以设置自己
的壁纸。mWallpaperMap中为每一个用户保存了一个WallpaperData实例,这个实例
中保存了和壁纸运行状态相关的信息。例如WallpaperService的ComponentName,
到WallpaperService的ServiceConnection等。于是当发生用户切换时,
WallpaperManagerService可以从mWallpaperMap中获取新用户的WallpaperData,
并通过保存在其中的ComponentName重新启动该用户所设置的壁纸。因此,
当通过setWallpaperComponent()设置新壁纸时,需要获取当前用户的WallpaperData,
并在随后更新其内容使之保存新壁纸的信息 */
intuserId = UserHandle.getCallingUserId();
WallpaperData wallpaper = mWallpaperMap.get(userId);
......
final long ident = Binder.clearCallingIdentity();
try{
......
// **② 启动新壁纸的WallpaperService**
bindWallpaperComponentLocked(name, false, true, wallpaper, null);
}finally {
Binder.restoreCallingIdentity(ident);
}
}
}
```
>[info] 注意 WallpaperManager.getIWallpaperManager()并没有作为SDK的一部分提供给开发者。因此第三方应用程序是无法进行动态壁纸的设置的。