当前位置:操作系统 > 安卓/Android >>

Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析

    在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的。在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。

       从前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow,后者是从Window类继承下来的。Activity、Window和PhonwWindow三个类的关系可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中的图3和图5。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:

 

图1 Activity和Window的类关系图

 

图2 Window和PhoneWindow的类关系图

       上述两个图中所涉及到的类的描述可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文,本文主要从Android应用程序窗口的创建过程来理解Activity、Window和PhonwWindow三个类的关系。

       从Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文又可以知道,与Activity组件所关联的一个PhoneWindow对象是从Activity类的成员函数attach中创建的,如图3所示:

 

图3 Android应用程序窗口的创建过程

       这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。

       Step 1. Activity.attach


[java] 
public class Activity extends ContextThemeWrapper   
        implements LayoutInflater.Factory,   
        Window.Callback, KeyEvent.Callback,   
        OnCreateContextMenuListener, ComponentCallbacks {   
    ......    
   
    private Window mWindow;    
    ......   
   
    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,   
            Object lastNonConfigurationInstance,   
            HashMap<String,Object> lastNonConfigurationChildInstances,   
            Configuration config) {   
        ......   
   
        mWindow = PolicyManager.makeNewWindow(this);   
        mWindow.setCallback(this);   
        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {   
            mWindow.setSoftInputMode(info.softInputMode);   
        }   
        ......   
   
        mWindow.setWindowManager(null, mToken, mComponent.flattenToString());   
        ......   
     
    }   
   
    ......   
}   
        这个函数定义在文件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的实现。

        Step 2. PolicyManager.makeNewWindow

[java] 
public final class PolicyManager { 
    private static final String POLICY_IMPL_CLASS_NAME = 
        "com.android.internal.policy.impl.Policy"; 
 
    private static final IPolicy sPolicy; 
 
    static { 
        // Pull in the actual implementation of the policy at run-time 
        try { 
            Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME); 
            sPolicy = (IPolicy)policyClass.newInstance(); 
        } catch (ClassNotFoundException ex) { 
            throw new RuntimeException( 
                    POLICY_IMPL_CLASS_NAME + " could not be loaded", ex); 
        } catch (InstantiationException ex) { 
            throw new RuntimeException( 
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex); 
        } catch (IllegalAccessException ex) { 
            throw new RuntimeException( 
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex); 
        } 
    } 
 
    ...... 
 
    // The static methods to spawn new policy-specific objects 
    public static Window makeNewWindow(Context context) { 
      &nbs

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,