Android6.0 亮����程(DisplayPowerController�WMS)(一)WMS绘制 - 百度文库

mKeyguardDrawComplete = false;

mWindowManagerDrawComplete = false;

mScreenOnListener = screenOnListener;//ÆÁÄ»µãÁÁºóµÄ»Øµ÷

if (mKeyguardDelegate != null) {

if (DEBUG_WAKEUP) Slog.d(TAG,

\ mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);

mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);

mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback); } else {

if (DEBUG_WAKEUP) Slog.d(TAG,

\ finishKeyguardDrawn(); } } }

ÎÒÃÇÏÈ¿´ÏÂmKeyguardDrawnCallback »Øµ÷£¬¾ÍÊÇ·¢ËÍMSG_KEYGUARD_DRAWN_COMPLETE£¨keyguard»æÖÆÍêµÄÏûÏ¢£© [cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬

final DrawnListener mKeyguardDrawnCallback = new DrawnListener() { @Override

public void onDrawn() {

if (DEBUG_WAKEUP) Slog.d(TAG, \ mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE); } }; ÎÒÃÇÔÙÀ´¿´¿´MSG_KEYGUARD_DRAWN_COMPLETEÒÔ¼°MSG_KEYGUARD_DRAWN_TIMEOUTÐźŵĴ¦Àí£¬¶¼»áµ÷ÓÃfinishKeyguardDrawnº¯Êý¡£ [cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ case MSG_KEYGUARD_DRAWN_COMPLETE:

if (DEBUG_WAKEUP) Slog.w(TAG, \ finishKeyguardDrawn(); break;

case MSG_KEYGUARD_DRAWN_TIMEOUT:

Slog.w(TAG, \ finishKeyguardDrawn(); break;

ÎÒÃÇÔÙÀ´¿´¿´finishKeyguardDrawnº¯Êý£¬»áÏÈÈ¥³ý¶ÓÁÐÖеÄMSG_KEYGUARD_DRAWN_TIMEOUTÏûÏ¢£¨ÒòΪ֮ǰ·¢µÄMSG_KEYGUARD_DRAWN_TIMEOUTÏûÏ¢£¬¿ÉÄÜkeyguard½áÊø·¢ËÍMSG_KEYGUARD_DRAWN_COMPLETEÏûÏ¢µ÷ÓõÄfinishKeyguardDrawn¾ÍÒª°ÑMSG_KEYGUARD_DRAWN_TIMEOUTÈ¥³ýÁË£©¡£È»ºó»áµ÷ÓÃ

[cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ private void finishKeyguardDrawn() { synchronized (mLock) {

if (!mScreenOnEarly || mKeyguardDrawComplete) {

return; // We are not awake yet or we have already informed of this event. }

mKeyguardDrawComplete = true; if (mKeyguardDelegate != null) {

mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); }

mWindowManagerDrawComplete = false; }

// ... eventually calls finishWindowsDrawn which will finalize our screen turn on // as well as enabling the orientation change logic/sensor.

mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback, WAITING_FOR_DRAWN_TIMEOUT); }

×îºóÎÒÃÇÔÙ¿´¿´WMSµÄwaitForAllWindowsDrawnº¯Êý£¬ÒÔ¼°Á½¸ö²ÎÊýmWindowManagerDrawCallbackºÍÒ»¸öWAITING_FOR_DRAWN_TIMEOUT£¨1Ã룩¡£

WMSµÄwaitForAllWindowsDrawnº¯Êý

ÎÒÃÇÏÈÀ´¿´¿´WMSµÄwaitForAllWindowsDrawnº¯Êý£¬»á°Ñ´«½øÀ´µÄ»Øµ÷±£´æÔÚmWaitingForDrawnCallback ¡£È»ºó±éÀúËùÓеÄwindows£¬°ÑÐèÒªÏÔʾ»òÕßÒѾ­ÏÔʾµÄ´°¿ÚÈ«²¿¼ÓÈëµ½mWaitingForDrawn£¬È»ºóµ÷ÓÃrequestTraversalLockedÕâ¸öº¯ÊýÎÒÃÇ֮ǰ·ÖÎö¹ý£¬¾ÍÊÇ·¢ËÍÒ»¸öÏûÏ¢£¬ÖØÐÂË¢ÐÂUI²¼¾Ö¡£È»ºóÎÒÃǼÌÐø·ÖÎöÕâ¸öº¯Êý£¬Èç¹ûmWaitingForDrawnΪ¿Õ£¬´ú±íûɶÏÔʾµÄÖ±½Óµ÷Óûص÷º¯Êý£¬Èç¹ûmWaitingForDrawnÓÐÒªÏÔʾµÄ´°¿Ú£¬¾ÍÒª»áÏÈ·¢ËÍÒ»¸öWAITING_FOR_DRAWN_TIMEOUT£¬Õâ¸ötimeout֮ǰ´«½øÀ´µÄÊÇ1Ã롣Ȼºóµ÷ÓÃcheckDrawnWindowsLockedº¯Êý¡£

[cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ @Override

public void waitForAllWindowsDrawn(Runnable callback, long timeout) { synchronized (mWindowMap) {

mWaitingForDrawnCallback = callback;//»Øµ÷±£´æÔÚmWaitingForDrawnCallback final WindowList windows = getDefaultWindowListLocked(); for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { final WindowState win = windows.get(winNdx);

final boolean isForceHiding = mPolicy.isForceHiding(win.mAttrs); Slog.i(TAG,\ if (win.isVisibleLw()

&& (win.mAppToken != null || isForceHiding)) { Slog.i(TAG,\ win.mWinAnimator.mDrawState =

WindowStateAnimator.DRAW_PENDING;

// Force add to mResizingWindows.

win.mLastContentInsets.set(-1, -1, -1, -1); mWaitingForDrawn.add(win);

// No need to wait for the windows below Keyguard. if (isForceHiding) { break; } } }

requestTraversalLocked(); }

mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); if (mWaitingForDrawn.isEmpty()) { callback.run();

Slog.i(TAG,\ } else {

mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout); checkDrawnWindowsLocked();

Slog.i(TAG,\ } }

ÎÒÃÇÏÈÀ´¿´ÏÂcheckDrawnWindowsLockedº¯Êý£¬Õâ¸öº¯Êý¡£±éÀú֮ǰ¼ÓÈëµÄmWaitingForDrawn£¨ÒªÏÔʾµÄ´°¿Ú£©£¬Õâ¸öʱºòÎÒÃǰÑÒѾ­È¥³ýµÄ£¬²»ÐèÒªÏÔʾµÄ£¬Ã»ÓÐsurfaceµÄ´°¿Ú´ÓmWaitingForDrawnÈ¥³ý£¬»¹ÓÐÒѾ­»æÖƺõÄҲȥ³ý¡£È»ºóÔÙµ±mWaitingForDrawnΪ¿Õʱ£¬¾Í·¢ËÍALL_WINDOWS_DRAWNÏûÏ¢¡£

[cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ void checkDrawnWindowsLocked() {

if (mWaitingForDrawn.isEmpty() || mWaitingForDrawnCallback == null) { return; }

for (int j = mWaitingForDrawn.size() - 1; j >= 0; j--) { WindowState win = mWaitingForDrawn.get(j);

if (win.mRemoved || !win.mHasSurface || !win.mPolicyVisibility) {

// Window has been removed or hidden; no draw will now happen, so stop waiting. if (DEBUG_SCREEN_ON) Slog.w(TAG, \ mWaitingForDrawn.remove(win); } else if (win.hasDrawnLw()) {

// Window is nowww.sm136.comw drawn (and shown).

if (DEBUG_SCREEN_ON) Slog.d(TAG, \ mWaitingForDrawn.remove(win); } }

if (mWaitingForDrawn.isEmpty()) {

if (DEBUG_SCREEN_ON) Slog.d(TAG, \ mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); mH.sendEmptyMessage(H.ALL_WINDOWS_DRAWN); } }

ALL_WINDOWS_DRAWNÏûÏ¢µÄ´¦Àí¾ÍÊÇÇå³ýmWaitingForDrawnCallback £¬È»ºóµ÷Óûص÷¡£

[cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ case ALL_WINDOWS_DRAWN: { Runnable callback;

synchronized (mWindowMap) {

callback = mWaitingForDrawnCallback; mWaitingForDrawnCallback = null; }

if (callback != null) { callback.run(); } }

»¹Óе±ÎÒÃǵ÷ÓÃwaitForAllWindowsDrawnÒ»°ã¶¼ÊÇÓÐÐèÒªÏÔʾµÄ´°¿Ú£¬µ«ÊÇÎÒÃÇÖ±½Óµ÷ÓÃcheckDrawnWindowsLockedº¯Êý£¬·¢ÏÖÓеĴ°¿Ú»¹Ã»»æÖÆÍê³É¡£ÄÇôÎÒÃǾÍÒªµÈ£¬»áÔÚˢеĺËÐĺ¯ÊýÖÐperformLayoutAndPlaceSurfacesLockedInnerÓÐÈçÏ´úÂ룬Õâ¸öʱºòÈç¹û֮ǰ»¹Ã»»æÖÆÍê³ÉµÄ´°¿Ú£¬»æÖƺÃÁË¡£»áÔÙµ÷ÓÃcheckDrawnWindowsLockedº¯Êý£¬Èç¹ûmWaitingForDrawnÖеĴ°¿Ú»æÖƺÃÁË£¬»áÔÚmWaitingForDrawnÖÐÈ¥³ýÕâ¸ö´°¿Ú¡£È»ºómWaitingForDrawnΪ¿ÕÁË£¬Ö®ºó»á·¢ËÍALL_WINDOWS_DRAWNÏûÏ¢£¬»¹µ÷ÓÃmWaitingForDrawnCallback»Øµ÷º¯Êý¡£

[cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ if (mWaitingForDrawnCallback != null ||

(mInnerFields.mOrientationChangeComplete && !defaultDisplay.layoutNeeded && !mInnerFields.mUpdateRotation)) { checkDrawnWindowsLocked(); }

µ±È»Èç¹ûÎÒÃÇ֮ǰûÓаÑmWaitingForDrawnÖеĴ°¿ÚÇå¿Õ£¬×îºóÔÚWAITING_FOR_DRAWN_TIMEOUT£¨ÕâÀïÊÇ1Ã룩ʱ¼äµ½ÁËÒ²»áµ÷Óûص÷µÄ¡£ [cpp] view plain copy ÔÚCODEÉϲ鿴´úÂëÆ¬ÅÉÉúµ½ÎҵĴúÂëÆ¬ case WAITING_FOR_DRAWN_TIMEOUT: { Runnable callback = null;

synchronized (mWindowMap) {

Slog.w(TAG, \ mWaitingForDrawn.clear();

callback = mWaitingForDrawnCallback; mWaitingForDrawnCallback = null; }

if (callback != null) {

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)