Window
本文简单介绍Window的创建过程。基于源码6.0,主要参考这里。
1.创建过程
Step1: Activity.attach
1
 | 
final void attach(Context context, ActivityThread aThread,
 | 
这个函数定义在文件frameworks/base/core/Java/android/app/Activity.java中。
在attach方法中,创建PhoneWindow对象并且保存在Activity类的成员变量mWindow中。然后方法setCallback、setOnWindowDismissedCallback、setSoftInputMode和setWindowManager来设置窗口回调接口、窗口消失回调接口、软键盘输入区域的显示模式和窗口管理器。
Step2: PhoneWindow.new
1
 | 
public class PhoneWindow extends Window implements MenuBuilder.Callback {
 | 
这个函数定义在文件frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java中。
调用LayoutInflater的静态成员函数from创建一个LayoutInflater实例,并且保存在成员变量mLayoutInflater中。这样,PhoneWindow类以后就可以通过成员变量mLayoutInflater来创建应用程序窗口的视图,这个视图使用类型为DecorView的成员变量mDecor来描述。PhoneWindow类还有另外一个类型为ViewGroup的成员变量mContentParent,用来描述一个视图容器,这个容器存放的就是成员变量mDecor所描述的视图的内容,不过这个容器也有可能指向的是mDecor本身。
Window的构造很简单,只是初始化一个Context。如下:
1
 | 
public abstract class Window {
 | 
这个函数定义在frameworks/base/core/java/android/view/Window.java中。
这个Context来自Activity,这样Window可以访问Activity的相关资源。使用getDefaultFeatures
方法设置默认的Features,这些Features将在requestFeature()中使用到,用来设置Window的一些现实特征,如下:
1
 | 
/** Flag for the "options panel" feature.  This is enabled by default. */
 | 
Step3: Window.setCallback
1
 | 
public abstract class Window {
 | 
这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。
设置Callback,这个方法在PhoneWindow的父类Window中,用来拦截键盘时间和其他触摸操作等。这个Callback在Activity中实现。
Step4: Window.setOnWindowDismissedCallback
1
 | 
public abstract class Window {
 | 
这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。
这个OnWindowDismissedCallback会在Window gone的时候调用,这个回调也是在Activity中实现。
Step5: Window.setSoftInputMode
1
 | 
public abstract class Window {
 | 
这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。
setSoftInputMode用来设置应用程序窗口的软键盘输入区域的显示模式。取值如下:
1
 | 
...
 | 
- SOFT_INPUT_STATE_UNSPECIFIED:没有指定软键盘输入区域的显示状态。
 - SOFT_INPUT_STATE_UNCHANGED:不要改变软键盘输入区域的显示状态。
 - SOFT_INPUT_STATE_HIDDEN:在合适的时候隐藏软键盘输入区域,例如,当用户导航到当前窗口时。
 - SOFT_INPUT_STATE_ALWAYS_HIDDEN:当窗口获得焦点时,总是隐藏软键盘输入区域。
 - SOFT_INPUT_STATE_VISIBLE:在合适的时候显示软键盘输入区域,例如,当用户导航到当前窗口时。
 - SOFT_INPUT_STATE_ALWAYS_VISIBLE:当窗口获得焦点时,总是显示软键盘输入区域。
 
- [ ] 等待详细介绍
 
Step5: Window.setWindowManager
1
 | 
public abstract class Window {
 | 
这个函数定义在文件frameworks/base/core/java/android/view/Window.java中。
从Activity的attach方法setWindowManager,传进来一个默认的WindowManager(WindowManagerImpl,来自SystemService
),调用这个WindowManager的createLocalWindowManager方法生成新的WindowManager对象保存到Window的成员mWindowManager。
并且在Activity中也使用成员mWindowManager保存这个Window生成的WindowManger(见Step1)。
参数appToken用来描述当前正在处理的窗口是与哪一个Activity组件关联的,它是一个Binder代理对象,引用了在ActivityManagerService这一侧所创建的一个类型为ActivityRecord的Binder本地对象。
参数appName用来描述当前正在处理的窗口所关联的Activity组件的名称,这个名称会被保存在Window类的成员变量mAppName中。
Step6: WindowManagerImpl.createLocalWindowManager
1
 | 
public final class WindowManagerImpl implements WindowManager {
 | 
这个函数定义在文件frameworks/base/core/java/android/view/WindowManagerImpl.java中。
WindowManagerGlobal是提供与上下文无关的系统窗口管理,只用于内部实现全局函数。
WindowManagerGlobal是一个单例,并且是窗口管理的真正现实类,不过在一般情况下,我们不直接使用使用它,而是通过已经绑定了上下文的WindowManager(WindowManagerImpl)来管理窗口。
所以,理所当然,WindowManager的实现类WindowManagerImpl里面需要有WindowManagerGlobal的实例,来真正处理窗口管理。
Display是用来描述全局的屏幕属性的,提供逻辑显示区域大小、密度的相关信息。
成员mParentWindow就是前面PhoneWindow实例,在创建WindowManager的时候传入的(见Step5)。
                    
                


                
            
        
浙公网安备 33010602011771号