WindowManagerService

Window

public class Activity extends ContextThemeWrapper implements ...... {

    private Window mWindow;
    private WindowManager mWindowManager;

    final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor,
            Window window, ActivityConfigCallback activityConfigCallback) {
        attachBaseContext(context);

        mFragments.attachHost(null /*parent*/);

        // 代码 1
        mWindow = new PhoneWindow(this, window, activityConfigCallback);
        mWindow.setWindowControllerCallback(this);
        // 代码 2
        mWindow.setCallback(this);
        mWindow.setOnWindowDismissedCallback(this);
       ···
        // 代码 3
        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();
    }

}

1、创建PhoneWindow
2、设置Window的callback,用户的触摸 & 键盘等输入事件就是通过此接口回调到 Activity 中的,Window#Callback 回调源码如下
3、获取WindowManager,WindowManager是ViewManager的子接口他的实现类是WindowManagerImpl,所有的方法都会转交给WindowManagerGlobal,这个类是进程单例的类,管理素有的Window,包含成员变量

ArrayList mViews:存储所有 Window 所对应的 View
ArrayList:存储所有 Window 所对应的 ViewRootImpl
ArrayList:存储所有 Window 所对应的 WindowManager.LayoutParams
ArraySet:存储所有即将被移除的 View

Session

ViewRootImpl 和 WMS 之间的通信就是通过 Session 对象完成的。
Session 类继承自 IWindowSession.Stub,每一个应用进程都有一个唯一的 Session 对象与 WMS 通信

WindowState

每一个应用的Window在WMS都对应着一个WindowState

class WindowState extends WindowContainer implements WindowManagerPolicy.WindowState {
    final WindowManagerService mService;
    final WindowManagerPolicy mPolicy;
    final Context mContext;
    final Session mSession;
    final IWindow mClient;


    WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
           WindowState parentWindow, int appOp, int seq, WindowManager.LayoutParams a,
           int viewVisibility, int ownerId, boolean ownerCanAddInternalSystemWindow) {
        mService = service;
        mSession = s;
        mClient = c;
        mAppOp = appOp;
        mToken = token;
        mAppToken = mToken.asAppWindowToken();

        ......
    }

    void attach() {
        if (localLOGV) Slog.v(TAG, "Attaching " + this + " token=" + mToken);
        mSession.windowAddedLocked(mAttrs.packageName);
    }
    
    ......
}

WindowToken

简单的理解,WindowToken 有两个作用:

1、在 WMS 中,一个 WindowToken 就代表着一个应用组件,应用组件包括:Activity、InputMethod 等。在 WMS 中,会将属于同一 WindowToken 的做统一处理,比如在对窗口进行 ZOrder 排序时,会将属于统一 WindowToken 的排在一起。
2、WindowToken 也具有令牌的作用。应用组件在创建 Window 时都需要提供一个有效的 WindowToken 以表明自己的身份,并且窗口的类型必须与所持有的 WindowToken 类型保持一致。如果是系统类型的窗口,可以不用提供 WindowToken,WMS 会自动为该系统窗口隐式的创建 WindowToken,但是要求应用必须具有创建该系统类型窗口的权限

AppWindowToken 是 WindowToken 的子类,与 WindowToken 不同的是,AppWindowToken 只可以用于 Activity 中的 Window 的 WindowToken。

参考
初步理解 Window 体系
Window与WMS通信过程
深入理解 WindowManagerService
有关Window的爱恨情仇!
Android源码-深入理解Window和WindowManager
WindowManagerService架构剖析之addWindow流程
Android窗口管理分析(2):WindowManagerService窗口管理之Window添加流程
WindowManagerService架构剖析之窗口分组与分层
深入理解WindowManagerService
[深入理解Android卷一全文-第八章]深入理解Surface系统

你可能感兴趣的:(WindowManagerService)