多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
启动动态壁纸可以通过调用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的一部分提供给开发者。因此第三方应用程序是无法进行动态壁纸的设置的。