frameworks\base\core\java\com\android\internal\policy\IKeyguardService.aidl
frameworks\base\core\java\com\android\internal\policy\IKeyguardDrawnCallback.aidl
oneway interface IKeyguardDrawnCallback {
void onDrawn();
}
frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java
* Mediates requests related to the keyguard. This includes queries about the
* state of the keyguard, power management events that effect whether the keyguard
* should be shown or reset, callbacks to the phone window manager to notify
* it of when the keyguard is showing, and events from the keyguard view itself
* stating that the keyguard was succesfully unlocked.
.....
frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardUpdateMonitorCallback.java
/**
* Callback for general information relevant to lock screen.
*/
public class KeyguardUpdateMonitorCallback {
frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardService.java
public class KeyguardService extends Service {
static final String TAG = "KeyguardService";
static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
private KeyguardViewMediator mKeyguardViewMediator;
private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {}
private IKeyguardDrawnCallback mDrawnCallback;
private boolean mIsPerUserLock;
KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
/**
* Used to keep the device awake while to ensure the keyguard finishes opening before
* we sleep.
*/
private PowerManager.WakeLock mShowKeyguardWakeLock;
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
KeyguardService 实现了IKeyguardService 客户端接口,其实是通过 mKeyguardViewMediator 对应接口实现的。
frameworks\base\packages\SystemUI\AndroidManifest.xml
<service
android:name=".keyguard.KeyguardService"
android:exported="true"
android:enabled="@bool/config_enableKeyguardService" />
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarKeyguardViewManager.java
/**
* Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
* via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
* which is in turn, reported to this class by the current
* {@link com.android.keyguard.KeyguardViewBase}.
*/
public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {
keyguad总界面布局: super_status_bar.xml
这里面有很对小的布局
对应的view 是
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarWindowView.java
手势码、PIN码等界面布局:
对应的view 是
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardBouncer.java
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java
createAndAddWindows(); 会inflateStatusBarWindow ,会将StatusBarManagerService与其关联
public void start() {
。。。
createAndAddWindows();
}
public void createAndAddWindows() {
addStatusBarWindow();
}
private void addStatusBarWindow() {
makeStatusBarView();
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
mRemoteInputController = new RemoteInputController(mHeadsUpManager);
mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
}
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarWindowManager.java
public void add(View statusBarView, int barHeight) {
// Now that the status bar window encompasses the sliding panel and its
// translucent backdrop, the entire thing is made TRANSLUCENT and is
// hardware-accelerated.
mLp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
barHeight,
WindowManager.LayoutParams.TYPE_STATUS_BAR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT);
mLp.token = new Binder();
mLp.gravity = Gravity.TOP;
mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
mLp.setTitle("StatusBar");
mLp.packageName = mContext.getPackageName();
mStatusBarView = statusBarView;
mBarHeight = barHeight;
mWindowManager.addView(mStatusBarView, mLp);
mLpChanged = new WindowManager.LayoutParams();
mLpChanged.copyFrom(mLp);
}
PRIVATE_FLAG_KEYGUARD
frameworks\base\services\core\java\com\android\server\statusbar\StatusBarManagerService.java
这个服务与StatusBar 对应的服务
keyguard 布局:
keyguard_status_bar.xml
对应的view
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardStatusBarView.java
对应的manager
/**
* Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
* via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
* which is in turn, reported to this class by the current
* {@link com.android.keyguard.KeyguardViewBase}.
*/
public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarKeyguardViewManager.java
创建keyguard ,这个是 super_status_bar.xml 布局中子布局status_bar_expanded 的子布局keyguard_status_bar 中的
mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header);
上滑keyguard 界面,keyguard 消失调用堆栈:
调用函数
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java
private void showBouncerIfKeyguard() {
if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
showBouncer();
}
}
protected void showBouncer() {
mWaitingForKeyguardExit = mStatusBarKeyguardViewManager.isShowing();
mStatusBarKeyguardViewManager.dismiss();
}
可以定制显示滑动解锁到 pin码界面显示导航栏时间
mMakeNavigationBarVisibleRunnable
Android O 之前
android O
绘制 scheduleTraversals 调用
frameworks\base\core\java\android\view\ViewRootImpl.java
void scheduleTraversals() {
if("StatusBar".equals(mWindowAttributes.getTitle().toString())){
Slog.d(mTag,"scheduleTraversals StatusBar");
}
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
if (ViewDebugManager.DEBUG_SCHEDULETRAVERSALS) {
Log.v(mTag, "scheduleTraversals: mTraversalBarrier = " + mTraversalBarrier
+ ",this = " + this, new Throwable("scheduleTraversals"));
}
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
if (!mUnbufferedInputDispatch) {
scheduleConsumeBatchedInput();
}
notifyRendererOfFramePending();
pokeDrawLockIfNeeded();
}
}
分支 1:
frameworks\base\core\java\android\hardware\display\DisplayManagerGlobal.java
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_DISPLAY_ADDED:
mListener.onDisplayAdded(msg.arg1);
break;
case EVENT_DISPLAY_CHANGED:
mListener.onDisplayChanged(msg.arg1);
break;
case EVENT_DISPLAY_REMOVED:
mListener.onDisplayRemoved(msg.arg1);
break;
}
}
}
frameworks\base\core\java\android\view\ViewRootImpl.java
private final DisplayListener mDisplayListener = new DisplayListener() {
@Override
public void onDisplayChanged(int displayId) {
if (mView != null && mDisplay.getDisplayId() == displayId) {
final int oldDisplayState = mAttachInfo.mDisplayState;
final int newDisplayState = mDisplay.getState();
if (oldDisplayState != newDisplayState) {
mAttachInfo.mDisplayState = newDisplayState;
pokeDrawLockIfNeeded();
if (oldDisplayState != Display.STATE_UNKNOWN) {
final int oldScreenState = toViewScreenState(oldDisplayState);
final int newScreenState = toViewScreenState(newDisplayState);
if (oldScreenState != newScreenState) {
mView.dispatchScreenStateChanged(newScreenState);
}
if (oldDisplayState == Display.STATE_OFF) {
// Draw was suppressed so we need to for it to happen here.
mFullRedrawNeeded = true;
scheduleTraversals();
}
}
}
}
}
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
if (ViewDebugManager.DEBUG_SCHEDULETRAVERSALS) {
Log.v(mTag, "scheduleTraversals: mTraversalBarrier = " + mTraversalBarrier
+ ",this = " + this, new Throwable("scheduleTraversals"));
}
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
if (!mUnbufferedInputDispatch) {
scheduleConsumeBatchedInput();
}
notifyRendererOfFramePending();
pokeDrawLockIfNeeded();
}
}
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
void doTraversal() {
if (ViewDebugManager.DEBUG_LIFECYCLE || ViewDebugManager.DEBUG_ENG) {
Log.v(mTag, "doTraversal: mTraversalScheduled = " + mTraversalScheduled + " mFisrt = "
+ mFirst + ",mTraversalBarrier = " + mTraversalBarrier + ",this = " + this);
}
if (mTraversalScheduled) {
mTraversalScheduled = false;
mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
if (mProfile) {
Debug.startMethodTracing("ViewAncestor");
}
performTraversals();
if (mProfile) {
Debug.stopMethodTracing();
mProfile = false;
}
}
}
分支 2:
frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardService.java
@Override // Binder interface
public void onScreenTurningOn(IKeyguardDrawnCallback callback) {
Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn");
checkPermission();
mKeyguardViewMediator.onScreenTurningOn(callback);
mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON);
Trace.endSection();
}
mKeyguardViewMediator.onScreenTurningOn(callback);==》
frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java
public void onScreenTurningOn(IKeyguardDrawnCallback callback) {
Trace.beginSection("KeyguardViewMediator#onScreenTurningOn");
notifyScreenOn(callback);
Trace.endSection();
}
private void notifyScreenOn(IKeyguardDrawnCallback callback) {
if (DEBUG) Log.d(TAG, "notifyScreenOn");
Message msg = mHandler.obtainMessage(NOTIFY_SCREEN_TURNING_ON, callback);
mHandler.sendMessage(msg);
}
mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON);==》
frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\KeyguardLifecyclesDispatcher.java
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SCREEN_TURNING_ON:
mScreenLifecycle.dispatchScreenTurningOn();
break;
case SCREEN_TURNED_ON:
mScreenLifecycle.dispatchScreenTurnedOn();
break;
frameworks\base\packages\SystemUI\src\com\android\systemui\keyguard\ScreenLifecycle.java
public void dispatchScreenTurningOn() {
setScreenState(SCREEN_TURNING_ON);
dispatch(Observer::onScreenTurningOn);
}
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java
ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
@Override
public void onScreenTurningOn() {
mFalsingManager.onScreenTurningOn();
mNotificationPanel.onScreenTurningOn();
maybePrepareWakeUpFromAod();
if (mLaunchCameraOnScreenTurningOn) {
mNotificationPanel.launchCamera(false, mLastCameraLaunchSource);
mLaunchCameraOnScreenTurningOn = false;
}
}
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\NotificationPanelView.java
public void onScreenTurningOn() {
mKeyguardStatusView.refreshTime();
}
com.android.keyguard.KeyguardStatusView.refreshTime(KeyguardStatusView.java:200)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: scheduleTraversals: mTraversalBarrier = 436,this = ViewRoot{c5a3c5b StatusBar,ident = 3}
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: java.lang.Throwable: scheduleTraversals
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:1416)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1207)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.GridLayout.requestLayout(GridLayout.java:1098)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.requestLayout(View.java:22154)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.checkForRelayout(TextView.java:8553)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.setText(TextView.java:5416)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.setText(TextView.java:5272)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.TextView.setText(TextView.java:5229)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.TextClock.onTimeChanged(TextClock.java:601)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.TextClock.setFormat12Hour(TextClock.java:312)
01-04 21:53:29.571177 1135 1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardStatusView.refreshTime(KeyguardStatusView.java:200)
分支3:
135 1135 D KeyguardViewMediator: handleNotifyScreenTurnedOn
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: scheduleTraversals: mTraversalBarrier = 441,this = ViewRoot{c5a3c5b StatusBar,ident = 3}
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: java.lang.Throwable: scheduleTraversals
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:1416)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.invalidate(ViewRootImpl.java:1227)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewRootImpl.onDescendantInvalidated(ViewRootImpl.java:1221)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.onDescendantInvalidated(ViewGroup.java:5811)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.onDescendantInvalidated(ViewGroup.java:5811)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.onDescendantInvalidated(ViewGroup.java:5811)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.ViewGroup.invalidateChild(ViewGroup.java:5829)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.invalidateInternal(View.java:15594)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.invalidate(View.java:15555)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.view.View.invalidate(View.java:15538)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.invalidateDrawable(ImageView.java:281)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:450)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.graphics.drawable.VectorDrawable.setAlpha(VectorDrawable.java:377)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.applyColorMod(ImageView.java:1561)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.updateDrawable(ImageView.java:1017)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.widget.ImageView.setImageDrawable(ImageView.java:567)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.KeyguardAffordanceView.setImageDrawable(KeyguardAffordanceView.java:148)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.LockIcon.update(LockIcon.java:181)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.LockIcon.update(LockIcon.java:120)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.LockIcon.setScreenOn(LockIcon.java:103)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.systemui.statusbar.phone.KeyguardBottomAreaView$4.onScreenTurnedOn(KeyguardBottomAreaView.java:767)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardUpdateMonitor.handleScreenTurnedOn(KeyguardUpdateMonitor.java:1174)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardUpdateMonitor.-wrap20(Unknown Source:0)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.keyguard.KeyguardUpdateMonitor$1.handleMessage(KeyguardUpdateMonitor.java:332)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.os.Handler.dispatchMessage(Handler.java:106)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.os.Looper.loop(Looper.java:164)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at android.app.ActivityThread.main(ActivityThread.java:6566)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at java.lang.reflect.Method.invoke(Native Method)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-04 21:53:29.950334 1135 1135 V ViewRootImpl[StatusBar]: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)
frameworks\base\packages\SystemUI\src\com\android\keyguard\KeyguardUpdateMonitor.java
case MSG_SCREEN_TURNED_ON:
handleScreenTurnedOn();
break;
private void handleScreenTurnedOn() {
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onScreenTurnedOn();
}
}
}
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\KeyguardBottomAreaView.java
@Override
public void onScreenTurnedOn() {
mLockIcon.setScreenOn(true);
}
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\LockIcon.java
public void setScreenOn(boolean screenOn) {
mScreenOn = screenOn;
update();
}
分支 4:
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: scheduleTraversals: mTraversalBarrier = 671,this = ViewRoot{81395ec com.android.launcher3/com.android.launcher3.Launcher,ident = 0mFrame=671}
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: java.lang.Throwable: scheduleTraversals
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at android.view.ViewRootImpl.scheduleTraversals(ViewRootImpl.java:1416)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at android.view.ViewRootImpl$1.onDisplayChanged(ViewRootImpl.java:1136)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.handleMessage(DisplayManagerGlobal.java:493)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at android.os.Handler.dispatchMessage(Handler.java:106)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at android.os.Looper.loop(Looper.java:164)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at android.app.ActivityThread.main(ActivityThread.java:6566)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at java.lang.reflect.Method.invoke(Native Method)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-05 00:05:33.570 1647 1647 V ViewRootImpl[Launcher]: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)
mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
frameworks\base\core\java\android\view\ViewRootImpl.java
scheduleTraversals() 调用
=》 mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
final TraversalRunnable mTraversalRunnable = new TraversalRunnable();
void doTraversal() {
if (mTraversalScheduled) {
mTraversalScheduled = false;
mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
if (mProfile) {
Debug.startMethodTracing("ViewAncestor");
}
performTraversals();
if (mProfile) {
Debug.stopMethodTracing();
mProfile = false;
}
}
}
https://www.jianshu.com/p/a65861e946cb
=>performTraversals() 中会执行
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
performLayout(lp, mWidth, mHeight);
performDraw()
=》performDraw()中执行
draw(fullRedrawNeeded);
pendingDrawFinished();或者postDrawFinished()
=》pendingDrawFinished(); 中执行
pendingDrawFinished();
->reportDrawFinished();
->mWindowSession.finishDrawing(mWindow);
或者
=>postDrawFinished() 中执行
->MSG_DRAW_FINISHED
->reportDrawFinished();
->mWindowSession.finishDrawing(mWindow);
frameworks\base\services\core\java\com\android\server\wm\Session.java
@Override
public void finishDrawing(IWindow window) {
if (WindowManagerService.localLOGV) Slog.v(
TAG_WM, "IWindow finishDrawing called for " + window);
mService.finishDrawingWindow(this, window);
}
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java
void finishDrawingWindow(Session session, IWindow client) {
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mWindowMap) {
WindowState win = windowForClientLocked(session, client, false);
if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "finishDrawingWindow: " + win + " mDrawState="
+ (win != null ? win.mWinAnimator.drawStateToString() : "null"));
if (win != null && win.mWinAnimator.finishDrawingLocked()) {
if ((win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
win.getDisplayContent().pendingLayoutChanges |=
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
}
win.setDisplayLayoutNeeded();
mWindowPlacerLocked.requestTraversal();
}
}
} finally {
Binder.restoreCallingIdentity(origId);
}
}
==》 mWindowPlacerLocked.requestTraversal();
Android 5.1 Keyguard初识
https://blog.csdn.net/u013656135/article/details/49122205
View绘制流程及源码解析(一)——performTraversals()源码分析
https://www.jianshu.com/p/a65861e946cb
界面显示_视图Choreographer控制
https://www.jianshu.com/p/47c866f6fb67