众所周知,Activity是Android应用程序的载体,允许用户在其上创建一个用户界面即视图,而这个视图又是通过Window来管理,同样,Dialog的视图其实也是通过Window来管理。而Window又是通过WindowManager将视图呈现到手机屏幕上。总而言之,Window在用户界面即视图中扮演着至关重要的角色。所以,如果要做好视图性能优化,理解Window的本质则是第一步!
那么,Window到底是一个什么样的存在呢?
以Activity为例,当一个Activity被实例化后,首先会被调用其attach方法,具体过程详见Android系统源码。attach方法中有一个非常重要的逻辑,那就是创建Window(API 22源码)。
final void attach(...) {
...
mWindow = new PhoneWindow(this);
mWindow.setCallback(this);
mWindow.setOnWindowDismissedCallback(this);
mWindow.getLayoutInflater().setPrivateFactory(this);
if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
if (info.uiOptions != 0) {
mWindow.setUiOptions(info.uiOptions);
}
...
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager