背景
针对安卓多屏幕情况下,如何实现多个屏幕的显示不一样的壁纸这部分内容,前面有文章已经实现了该功能:

功能实现的链接:
android多屏情况如何让壁纸支持多屏异显-学员作业
但是这部分主要是针对静态壁纸的多屏显示不同,而且这个属于完全自己的改的方案,所以可能对系统有侵入式修改。
无意中发现google的官方文档也有关于多屏壁纸显示的,这里给大家也分享一下,具体的官方的文档这块多屏壁纸具体实现马哥这边后续有时间也会探索分享给大家。
下面先看看Google官方文档介绍多屏壁纸相关的支持。
壁纸
在 Android 10 及更高版本中,辅助屏幕可支持壁纸:


图 2. 内部(上方)和外部(下方)屏幕上的动态壁纸
开发者可以通过在 WallpaperInfo XML 定义中提供 android:supportsMultipleDisplays=“true” 来声明对壁纸功能的支持。壁纸开发者还可以使用 WallpaperService.Engine#getDisplayContext() 中的显示上下文来加载素材资源。
框架会为每个屏幕创建一个 WallpaperService.Engine 实例,因此每个引擎都有自己的 surface 和显示上下文。开发者需要确保每个引擎都能够根据 VSYNC 以不同的帧频独立绘制。
针对单个屏幕选择壁纸
Android 10 平台无法直接支持针对单个屏幕选择壁纸。为了实现此功能,每个屏幕都需要一个稳定的屏幕标识符来保留壁纸设置。Display#getDisplayId() 是动态的,因此无法保证物理屏幕在重启后仍具有相同的 ID。
不过,Android 10 新增了 DisplayInfo.mAddress,其中包含用于物理屏幕的稳定标识符,且将来可用于完整实现。遗憾的是,现在为 Android 10 实现该逻辑已经太迟了。建议采用以下解决方案:
1、使用 WallpaperManager API 设置壁纸。
2、WallpaperManager 是从 Context 对象获得的,每个 Context 对象均具有相应屏幕 (Context#getDisplay()/getDisplayId()) 的相关信息。因此,您可以从 WallpaperManager 实例获取 displayId,而无需添加新方法。
3、在框架端,使用从 Context 对象获得的 displayId,并将其映射到静态标识符(例如物理屏幕的端口)。使用该静态标识符来保留所选壁纸。
此解决方案利用了壁纸选择器的现有实现。如果在特定屏幕上打开壁纸选择器并使用正确的 Context,则当选择器请求设置壁纸时,系统可以自动识别该屏幕。
如果需要为当前屏幕以外的屏幕设置壁纸,请为目标屏幕创建一个新的 Context 对象 (Context#createDisplayContext),并从该屏幕中获取 WallpaperManager 实例。
安全限制
系统不会在不属于自己的虚拟屏幕上显示壁纸。 这是出于安全考虑,因为恶意应用可能会创建启用了系统装饰支持的虚拟屏幕,并从 surface 读取用户敏感信息(例如个人照片)。
实现
在 Android 10 中,IWallpaperConnection#attachEngine() 和 IWallpaperService#attach() 接口接受 displayId 参数来创建与每个屏幕之间的连接。 WallpaperManagerService.DisplayConnector 封装了每个屏幕的壁纸引擎和连接。在 WindowManager 中,会在构建时为每个 DisplayContent 对象创建壁纸控制器,而不是为所有屏幕创建一个 WallpaperController。
一些公共 WallpaperManager 方法实现(如 WallpaperManager#getDesiredMinimumWidth())已更新,以计算并提供相应屏幕的信息。添加了 WallpaperInfo#supportsMultipleDisplays() 和相应的资源属性,以便应用开发者可以报告哪些壁纸已可供多个屏幕使用。
如果默认屏幕上显示的壁纸服务不支持多个屏幕,则系统会在辅助屏幕上显示默认壁纸。

图 3. 辅助屏幕的壁纸回退逻辑
原文地址:
https://source.android.google.cn/docs/core/display/multi_display/system-decorations
更多framework实战开发干货,请关注下面“千里马学框架”
4453

被折叠的 条评论
为什么被折叠?



