Android中窗口的创设过程

Android中窗口的创建过程在阅读本文之前建议先阅读我的另外一篇Java层Binder机制详解,因为里面有些地方涉

Android中窗口的创建过程

在阅读本文之前建议先阅读我的另外一篇Java层Binder机制详解,因为里面有些地方涉及到通过进程间通过Binder机制通信。

在Android将窗口分为三类:应用窗口,子窗口,系统窗口

应用窗口一般需要和一个Activity对应,子窗口是有父窗口的窗口,系统窗口时由系统创建的窗口,用户是无法创建系统窗口的(Toast,输入法窗口,壁纸窗口除外)


这里我主要分析一下应用窗口的创建过程,如果不对的地方希望能提出。

上面说了应用窗口时和Activity对应的,所以应用窗口时伴随Activity创建而创建的,所以首先从Activity的创建开始,Android的所有的应用的入口函数是ActivityThread的main函数,经过辗转调用就会执行到handleLaunchActivity,那我们就从handleLaunchActivity开始吧


然后我们通过mContentParent.addView(view, params);将我们的View添加到mContentParent中。

好吧,那我们接着进行分析吧

经过辗转的调用,下面就会调用到Activity中的

public static IWindowSession getWindowSession(Looper mainLooper) {        synchronized (mStaticInit) {            if (!mInitialized) {                try {                    InputMethodManager imm = InputMethodManager.getInstance(mainLooper);                    sWindowSession = IWindowManager.Stub.asInterface(                            ServiceManager.getService("window"))                            .openSession(imm.getClient(), imm.getInputContext());                    mInitialized = true;                } catch (RemoteException e) {                }            }            return sWindowSession;        }    }

也就是说其实调用的是WindowManagerService.Session.add的方法,而在WindowManagerService.Session.add中是调用的WindowManagerService.addWindow方法,好了,窗口的创建完成了。