再次回到InputMonitor#updateInputWindows(),调用SurfaceControl.Transaction#merge,之后,当WindowAnimator.java的animate()时发起apply();可以是线程"android.anim"或"binder"线程;
@frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
updateFocusedWindowLocked
// 向InputMonitor中设置焦点窗口
@frameworks/base/services/core/java/com/android/server/wm/InputMonitor.java
if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) { getInputMonitor().setInputFocusLw(newFocus, updateInputWindows); }
ProtoLog.v(WM_DEBUG_FOCUS_LIGHT, "Input focus has changed to %s display=%d", newWindow, mDisplayId); //这里log打印要切到那个窗口
final IBinder focus = newWindow != null ? newWindow.mInputChannelToken : null; // 更新当前焦点窗口
setUpdateInputWindowsNeededLw() // 更新当前焦点窗口 使mUpdateInputWindowsNeeded设置为true
mUpdateInputWindowsNeeded = true;
if (updateInputWindows) { updateInputWindowsLw(false /*force*/); } // 更新所有inputwindow
if (!force && !mUpdateInputWindowsNeeded) { return; }
scheduleUpdateInputWindows();
//mUpdateInputWindowsPending只是用来保证post执行不被重复执行,配合锁实现
if (!mUpdateInputWindowsPending) mUpdateInputWindowsPending = true; mHandler.post(mUpdateInputWindows); }
UpdateInputWindows::run()
if (mDisplayRemoved) { return; } //没有display的话return
final boolean inDrag = mService.mDragDropController.dragDropActiveLocked(); // 是否正在拖拽
mUpdateInputForAllWindowsConsumer.updateInputWindows(inDrag); // 在默认显示上添加所有窗口。
//显式创建的特殊InputConsumer对象
mPipInputConsumer = getInputConsumer(INPUT_CONSUMER_PIP); // 用于处理Nav相关input事件
mWallpaperInputConsumer = getInputConsumer(INPUT_CONSUMER_WALLPAPER); // 用于处理壁纸相关input事件
mRecentsAnimationInputConsumer = getInputConsumer(INPUT_CONSUMER_RECENTS_ANIMATION) // 用于处理最近的动画输入相关input事件
resetInputConsumers(mInputTransaction); // 重置mInputTransaction
// 如果处于活动状态,则更新最近的输入消费者层
final ActivityRecord activeRecents = getWeak(mActiveRecentsActivity);
if (mAddRecentsAnimationInputConsumerHandle && getWeak(mActiveRecentsActivity) != null) {
final WindowContainer layer = getWeak(mActiveRecentsLayerRef);
mRecentsAnimationInputConsumer.show(mInputTransaction, layer != null ? layer : g