美文网首页
Android IWindowSession

Android IWindowSession

作者: 丸子不爱吃丸子 | 来源:发表于2019-08-19 11:15 被阅读0次

WindowManager.java抽象类,具体实现靠WindowManagerImpl

WindowManagerImpl.java委托windmanagerGlobal干活

WindowManagerGlobal.java真正完成windowmanager任务

ViewRootImpl.java

PhoneWindow.java这个才是我们看到的window

PhoneWindowManager.java

以上类全部在客户端中使用.

IWindowSession:

IWindowSession 在客户端中使用,他是window在客户端持有windowManagerService的类似于应用的东西,客户端通过IWindowSession向WMS发送请求.

IWindowSession 在viewRootImpl构造函数中初始化:

final IWindowSession mWindowSession;
public ViewRootImpl(Context context, Display display) {
    mWindowSession = WindowManagerGlobal.getWindowSession();
}

public static IWindowSession getWindowSession() {
    synchronized (WindowManagerGlobal.class) {
        if (sWindowSession == null) {
            try {
                InputMethodManager imm = InputMethodManager.getInstance();
                IWindowManager windowManager = getWindowManagerService();
                sWindowSession = windowManager.openSession(
                        new IWindowSessionCallback.Stub() {
                            @Override
                            public void onAnimatorScaleChanged(float scale) {
                                ValueAnimator.setDurationScale(scale);
                            }
                        },
                        imm.getClient(), imm.getInputContext());
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        return sWindowSession;
    }
}

可以看到这里是一个binder调用,最终调用到了WMS:

public IWindowSession openSession(IWindowSessionCallback callback, IInputMethodClient client,
        IInputContext inputContext) {
    if (client == null) throw new IllegalArgumentException("null client");
    if (inputContext == null) throw new IllegalArgumentException("null inputContext");
    Session session = new Session(this, callback, client, inputContext);
    return session;
}

这个session就是被用来与WMS通讯使用:

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
     collectViewAttributes();
                   res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
                           getHostVisibility(), mDisplay.getDisplayId(), mWinFrame,
                           mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
                           mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel);
}

相关文章

网友评论

      本文标题:Android IWindowSession

      本文链接:https://www.haomeiwen.com/subject/qwxssctx.html