Android T wallpaper相关流程

介绍

什么是壁纸?
壁纸即是一个壁纸服务,每换一张壁纸 ,就是将该图片写入壁纸文件,再启动一个壁纸服务读取该壁纸文件显示出来的过程。
我们常见的壁纸在客户端的代码在systemUI中ImageWallpaper,壁纸服务实现在SystemUI里面,所以其会跟随SystemUI进程的启动而启动,不论是系统应用壁纸,还是三方应壁纸,基本上都会去继承WallpaperService,这里我们主要讲解静态壁纸的显示和移除,主要涉及WallpaperService和WallpaperManagerService

学习思路

在我们完全不了解壁纸逻辑的情况下如何学习这个模块?前面我们学习WMS的添加等相关流程见:Android T WMS窗口相关流程,因此我们可以先从壁纸中添加和移除逻辑入手。
1.这里以添加为例,如果我们要添加窗口,必然会涉及addView,addToDisplay(客户端)或addWindow(服务端)的流程
2.ImageWallpaper在systemUI进程中,因此我们首先想到的是调用客户端中的添加窗口方式
3.在代码中搜索相关代码addView,addToDisplay
发现在WallpaperService代码中有相关的添加逻辑,在updateSurface方法中,以此跟踪流程
在这里插入图片描述
但是通过查找代码发现有很多地方都调用了这个updateSurface,怎么确定流程呢?
在这里插入图片描述

4.找token,壁纸的窗口属于非system window,因此可能会通过mLayout.token的方式添加token.
mLayout.token = mWindowToken;发现有token,看看是什么时候赋值的,发现其在attach()方法中有赋值
在这里插入图片描述
该方法在最后也调用了updateSurface()
5.继续看谁调用的attach(),看看我们发现了什么?
在这里插入图片描述
这里是跨进程通信,WallpaperService继承Service
6.最终我们找到了WallpaperManagerService
在这里插入图片描述
其调用了attach
在这里插入图片描述

后面有同样的方法查找,这里不在赘述

注:如果了解SurfaceControl可以在其show()方法中打印堆栈,追踪流程,里面有三个关键方法:show()、hide()、remove()

壁纸切换流程简述

在这里插入图片描述

其中attach方法和detach方法是作为异步binder调用
在这里插入图片描述
可以看到这里定义的是oneway

问题

从代码中可以看出壁纸的移除和添加是异步调用,那么就有概率会出现,旧壁纸移除了,但是新壁纸还没有添加完成的情况,那么在切换过程中就可能会有闪黑现象,因此我们可以尝试把旧壁纸的移除逻辑放在新壁纸添加完成后
WallpaperService.java
在这里插入图片描述
在这里注释掉壁纸移除WindowState逻辑
WallpaperManagerService.java
在这里插入图片描述
在这里注释掉壁纸移除WindowToken逻辑
WallpaperManagerService.java
在这里插入图片描述
在这里添加壁纸移除逻辑,直接移除WindowToken则不需要移除windowState
mWindowManagerInternal.removeWindowToken(mToken, false/* removeWindows */, mDisplayId);

其他参考

android7.0 wallpaper显示流程

猜你喜欢

转载自blog.csdn.net/yimelancholy/article/details/130452283
T