您好,欢迎访问三七文档
在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的。在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。从前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow,后者是从Window类继承下来的。Activity、Window和PhoneWindow三个类的关系可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中的图3和图5。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:图1Activity和Window的类关系图图2Window和PhoneWindow的类关系图上述两个图中所涉及到的类的描述可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文,本文主要从Android应用程序窗口的创建过程来理解Activity、Window和PhoneWindow三个类的关系。从Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文又可以知道,与Activity组件所关联的一个PhoneWindow对象是从Activity类的成员函数attach中创建的,如图3所示:图3Android应用程序窗口的创建过程这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。Step1.Activity.attach[java]viewplaincopy1.publicclassActivityextendsContextThemeWrapper2.implementsLayoutInflater.Factory,3.Window.Callback,KeyEvent.Callback,4.OnCreateContextMenuListener,ComponentCallbacks{5.......6.7.privateWindowmWindow;8.......9.10.finalvoidattach(Contextcontext,ActivityThreadaThread,11.Instrumentationinstr,IBindertoken,intident,12.Applicationapplication,Intentintent,ActivityInfoinfo,13.CharSequencetitle,Activityparent,Stringid,14.ObjectlastNonConfigurationInstance,15.HashMapString,ObjectlastNonConfigurationChildInstances,16.Configurationconfig){17.......18.19.mWindow=PolicyManager.makeNewWindow(this);20.mWindow.setCallback(this);21.if(info.softInputMode!=WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED){22.mWindow.setSoftInputMode(info.softInputMode);23.}24.......25.26.mWindow.setWindowManager(null,mToken,mComponent.flattenToString());27.......28.29.}30.31.......32.}这个函数定义在文件frameworks/base/core/java/android/app/Activity.java中。在前面Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文中,我们已经分析过这个函数的实现了,这里我们只关注与应用程序窗口创建相关的代码。函数首先调用PolicyManager类的静态成员函数makeNewWindow来创建一个类型为PhoneWindow的应用程序窗口,并且保存在Activity类的成员变量mWindow中。有了这个类型为PhoneWindow的应用程序窗口,函数接下来还会调用它的成员函数setCallback、setSoftInputMode和setWindowManager来设置窗口回调接口、软键盘输入区域的显示模式和本地窗口管理器。PhoneWindow类的成员函数setCallback、setSoftInputMode和setWindowManager都是从父类Window继承下来的,因此,接下来我们就继续分析PolicyManager类的静态成员函数makeNewWindow,以及Window类的成员函数setCallback、setSoftInputMode和setWindowManager的实现。Step2.PolicyManager.makeNewWindow[java]viewplaincopy1.publicfinalclassPolicyManager{2.privatestaticfinalStringPOLICY_IMPL_CLASS_NAME=3.com.android.internal.policy.impl.Policy;4.5.privatestaticfinalIPolicysPolicy;6.7.static{8.//Pullintheactualimplementationofthepolicyatrun-time9.try{10.ClasspolicyClass=Class.forName(POLICY_IMPL_CLASS_NAME);11.sPolicy=(IPolicy)policyClass.newInstance();12.}catch(ClassNotFoundExceptionex){13.thrownewRuntimeException(14.POLICY_IMPL_CLASS_NAME+couldnotbeloaded,ex);15.}catch(InstantiationExceptionex){16.thrownewRuntimeException(17.POLICY_IMPL_CLASS_NAME+couldnotbeinstantiated,ex);18.}catch(IllegalAccessExceptionex){19.thrownewRuntimeException(20.POLICY_IMPL_CLASS_NAME+couldnotbeinstantiated,ex);21.}22.}23.24.......25.26.//Thestaticmethodstospawnnewpolicy-specificobjects27.publicstaticWindowmakeNewWindow(Contextcontext){28.returnsPolicy.makeNewWindow(context);29.}30.31.......32.}这个函数定义在文件frameworks/base/core/java/com/android/internal/policy/PolicyManager.java中。PolicyManager是一个窗口管理策略类,它在第一次被使用的时候,就会创建一个Policy类实例,并且保存在静态成员变量sPolicy中,以后PolicyManager类的窗口管理策略就是通过这个Policy类实例来实现的,例如,PolicyManager类的静态成员函数makeNewWindow就是通过调用这个Policy类实例的成员函数makeNewWindow来创建一个具体的应用程序窗口的。接下来,我们就继续分析Policy类的成员函数makeNewWindow的实现。Step3.Policy.makeNewWindow[java]viewplaincopy1.publicclassPolicyimplementsIPolicy{2.......3.4.publicPhoneWindowmakeNewWindow(Contextcontext){5.returnnewPhoneWindow(context);6.}7.8.......9.}这个函数定义在文件frameworks/base/policy/src/com/android/internal/policy/impl/Policy.java中。Policy类的成员函数makeNewWindow的实现很简单,它只是创建了一个PhoneWindow对象,然后返回给调用者。接下来,我们就继续分析PhoneWindow类的构造函数的实现,以便可以了解一个类型为PhoneWindow的应用程序窗口的创建过程。Step4.newPhoneWindow[java]viewplaincopy1.publicclassPhoneWindowextendsWindowimplementsMenuBuilder.Callback{2.......3.4.//Thisisthetop-levelviewofthewindow,containingthewindowdecor.5.privateDecorViewmDecor;6.7.//Thisistheviewinwhichthewindowcontentsareplaced.Itiseither8.//mDecoritself,orachildofmDecorwherethecontentsgo.9.privateViewGroupmContentParent;10.......11.12.privateLayoutInflatermLayoutInflater;13.......14.15.publicPhoneWindow(Contextcontext){16.super(context);17.mLayoutInflater=LayoutInflater.from(context);18.}19.20.......21.}这个函数定义在文件frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java中。PhoneWindow类的构造函数很简单,它首先调用父类Window的构造函数来执行一些初始化操作,接着再调用LayoutInflater的静态成员函数from创建一个LayoutInflater实例,并且保存在成员变量mLayoutInflater中。这样,PhoneWindow类以后就可以通过成员变量mLayoutInflater来创建应用程序窗口的视图,这个视图使用类型为DecorView的成员变量mDecor来描述。PhoneWindow类还有另外一个类型为ViewGroup的成员变量mContentParent,用来描述一个视图容器,这个容器存放的就是成员变量mDecor所描述的视图的内容,不过这个容器也有可能指向的是mDecor本身。在后面的文章中,我们再详细分析类型为PhoneWindow的应用程序窗口的视图的创建过程。Window的构造函数定义在文件frameworks/base/core/java/android/view/Window.java中,它的实现很简单,只是初始化了其成员变量mContext,如下所示:[ja
本文标题:Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析
链接地址:https://www.777doc.com/doc-3351275 .html