Window 一个抽象出来的安卓屏幕区域,抽象的窗口关联着2个很重要的概念
RootViewImpl 作为WMS和View界面的桥梁
View window最底层有一个DecorView
WindowManager 抽象出管理Window,添加View,删除,设置
windowManager添加View逻辑梳理
首先去实现类WindowManagerImpl
WindowManagerGlobal.addView
ViewRootImpl.setView
sWindowSession.add
通知WMS添加
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(),
mAttachInfo.mContentInsets, mInputChannel);
sWindowSession是IWindowManager抽象一个openSession().实际上是打开一个Binder,也就是去WMS通信去了
获取IWindowManager
public static IWindowManager getWindowManagerService() {
synchronized (WindowManagerGlobal.class) {
if (sWindowManagerService == null) {
sWindowManagerService = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"));
}
return sWindowManagerService;
}
}
这里面把IWindowManager当作aidl里面那种,bind获取到然后调用Stub.asInterface转为接口,即可拿到远程服务的接口然后调用方法。
获取WindowSession
sWindowSession = windowManager.openSession(
new IWindowSessionCallback.Stub() {
@Override
public void onAnimatorScaleChanged(float scale) {
ValueAnimator.setDurationScale(scale);
}
},
imm.getClient(), imm.getInputContext());
一步步拿到windowManager的addView,实际上还是找到wms的binder,然后调用。