Android R: mFocusedWindow和mFocusedApp更新流程
有些场景下会根据mFocusedWindow和mFocusedApp做一下开发。 所以,分析mFocusedWindow和mFocusedApp更新流程还是有必要的。
1,mFocusedWindow更新流程
mFocusedWindow是WindowState类
mFocusedWindow在DisplayPolicy类中
mFocusedWindow更新的接口在:
WindowManagerService.updateFocusedWindowLocked()
其他类也会调用updateFocusedWindowLocked方法。
例如: WindowToken, ActivityRecord, WindowState
例如ActivityRecord 在 commitVisibility() 通过:
mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,false)
来更新mFocusedWindow
WindowManagerService.java
boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows)
->
RootWindowContainer.java
updateFocusedWindowLocked()
->
DisplayContent.java
updateFocusedWindowLocked() {
getDisplayPolicy().focusChangedLw()
}
->
DisplayPolicy.java
public int focusChangedLw(WindowState lastFocus, WindowState newFocus) {
mFocusedWindow = newFocus;
}
2, mFocusedApp更新流程
mFocusedApp是ActivityRecord类
mFocusedApp在DisplayContent类中
mFocusedApp的更新接口在:
ActivityTaskManagerService.setResumedActivityUncheckLocked()
其他类,如ActivityRecord也会调用setFocusedApp()
ActivityTaskManagerService.java
setResumedActivityUncheckLocked() {
r.getDisplay().setFocusedApp(r, true);
}
->
DisplayContent.java
void setFocusedApp(ActivityRecord r, boolean moveFocusNow)
->
boolean setFocusedApp(ActivityRecord newFocus) {
mFocusedApp = newFocus;
..
getInputMonitor().setFocusedAppLw(newFocus);
}
InputMonitor.java
public void setFocusedAppLw(ActivityRecord newApp) {
if (newApp == null) {
mService.mInputManager.setFocusedApplication(mDisplayId, null);
} else {
final InputApplicationHandle handle = newApp.mInputApplicationHandle;
handle.name = newApp.toString();
handle.dispatchingTimeoutNanos = newApp.mInputDispatchingTimeoutNanos;
mService.mInputManager.setFocusedApplication(mDisplayId, handle);
}
}
3,调试
dumpsys input | grep -i focus
dumpsys window | grep -i focus
|