android4.0 休眠唤醒会出现之前界面,我们通过桌面远程工具可以看到在休眠时候,系统已经进入解锁界面。可是我们唤醒机器的时候,系统会闪一下之前操作的界面,再进入解锁界面。所以判断应该是休眠时候没有把解锁界面写入framebuffer,找到写framebuffer地方:
if (LIKELY(hw.canDraw())) { // repaint the framebuffer (if needed) const int index = hw.getCurrentBufferIndex(); GraphicLog& logger(GraphicLog::getInstance()); logger.log(GraphicLog::SF_REPAINT, index); handleRepaint(); // inform the h/w that we're done compositing logger.log(GraphicLog::SF_COMPOSITION_COMPLETE, index); hw.compositionComplete(); logger.log(GraphicLog::SF_SWAP_BUFFERS, index); postFramebuffer(); logger.log(GraphicLog::SF_REPAINT_DONE, index); } else { // pretend we did the post hw.compositionComplete(); usleep(16667); // 60 fps period }
bool DisplayHardwareBase::canDraw() const { return mScreenAcquired; }
所以把操作mScreenAcquired的值的相关代码去掉就可以了:
--- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp +++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp @@ -80,11 +80,13 @@ bool DisplayHardwareBase::DisplayEventThread::threadLoop() if (err >= 0) { sp<SurfaceFlinger> flinger = mFlinger.promote(); LOGD("About to give-up screen, flinger = %p", flinger.get()); + /* if (flinger != 0) { mBarrier.close(); flinger->screenReleased(0); mBarrier.wait(); } + */ } fd = open(kWakeFileName, O_RDONLY, 0); do { @@ -95,8 +97,10 @@ bool DisplayHardwareBase::DisplayEventThread::threadLoop() if (err >= 0) { sp<SurfaceFlinger> flinger = mFlinger.promote(); LOGD("Screen about to return, flinger = %p", flinger.get()); + /* if (flinger != 0) flinger->screenAcquired(0); + */ } return true; }