1.通过现象其他systemui还在只是壁纸部分所在的背景黑了一瞬定位是壁纸问题
2.观察壁纸有关log:
行 240: 05-14 03:54:15.295 1512 1512 D ImageWallpaper: onAmbientModeChanged: inAmbient=false, duration=500, mShouldStopTransition=false
行 243: 05-14 03:54:15.296 1512 1641 V ImageWallpaperRenderer: onRevealStart: start, anim=true
行 244: 05-14 03:54:15.296 1512 1641 D ImageWallpaper: preRender start
行 245: 05-14 03:54:15.301 1512 1641 D ImageWallpaper: preRender end
行 246: 05-14 03:54:15.301 1512 1641 V ImageWallpaperRenderer: onRevealStart: done
行 253: 05-14 03:54:15.817 1512 1641 V ImageWallpaperRenderer: onRevealEnd: start, mScissorMode=true
行 254: 05-14 03:54:15.830 1512 1641 D ImageWallpaper: postRender start
行 255: 05-14 03:54:15.830 1512 1641 D ImageWallpaper: postRender end
行 256: 05-14 03:54:15.830 1512 1641 V ImageWallpaperRenderer: onRevealEnd: done
定位大概位置ImageWallpaper: 用于绘制壁纸
3.ImageWallpaper: requestRender()用于绘制壁纸开机时绘制一次 其余点亮屏幕时最终也会走到这里
@Override
public void requestRender() {
// This method should only be invoked from worker thread.
Trace.beginSection("ImageWallpaper#requestRender");
requestRenderInternal();
Trace.endSection();
}
private void requestRenderInternal() {
Rect frame = getSurfaceHolder().getSurfaceFrame();
boolean readyToRender = mEglHelper.hasEglContext() && mEglHelper.hasEglSurface()
&& frame.width() > 0 && frame.height() > 0;
if (readyToRender) {
mRenderer.onDrawFrame();
if (!mEglHelper.swapBuffer()) {
Log.e(TAG, "drawFrame failed!");
}
} else {
Log.e(TAG, "requestRender: not ready, has context=" + mEglHelper.hasEglContext()
+ ", has surface=" + mEglHelper.hasEglSurface()
+ ", frame=" + frame);
}
}
4.打了个堆栈log发现 会走两次绘制 第二次的调用是在ImageWallpaperRenderer: onRevealStateChanged()
@Override
public void onRevealStateChanged() {
// mProxy.requestRender();
}
尝试去掉,问题解决
5. 网上查询关于第二次绘制的说法,在某些情况下,当屏幕从全屏幕模式切换回来时,壁纸会没有及时地刷新,导致画面显示异常。
为了避免这种情况,Android 系统通常会使用 onRevealStateChanged 回调来检测屏幕状态变化,并重新渲染壁纸。
因此,在 onRevealStateChanged 中重复渲染一次壁纸,可以确保壁纸呈现正确,但如果不需要实时刷新壁纸,也可以将其放在单独的方法中,在恰当的时候调用它并重新绘制壁纸。
考虑到这种异常状况发生概率微乎其微,如果壁纸界面能够及时响应用户的操作而没有呈现异常,也就是不需要再重新渲染一次壁纸 所以去掉。