Activity,ContextImpl,PhoneWindow对象创建总结
在Android程序的入口是从ActivityThread.main 函数开始执行。
在ActivityThread. performLaunchActivity()这个函数创建出了Activity对象,ContextImpl对象,PhoneWindow对象,WindowManager对象。再进去该函数看看:
public final class ActivityThread {
......
  private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
      ......
        Activity activity = null;
        try {
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);//创建出Activity
            r.intent.setExtrasClassLoader(cl);
            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {
        }
        try {
             ......
            if (activity != null) {
                ContextImpl appContext = new ContextImpl();//创建ContextImpl对象
                appContext.init(r.packageInfo, r.token, this);
                appContext.setOuterContext(activity);//向ContextImpl对象的mContext成员变量赋值 指向当前Activity。
                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                Configuration config = new Configuration(mConfiguration);
                .......
                //在这个函数里面,在前面的文章分析过,主要的操作
                //保存ContextImpl对象在Activity的父类mBase成员变量中
                //创建出PhoneWindow对象
                //创建WindowManagerImpl对象,LocalWindowManager对象
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstance,
                        r.lastNonConfigurationChildInstances, config);
                ......
                //@#$@$%$%%@¥¥*&¥
                mInstrumentation.callActivityOnCreate(activity, r.state);
              .......
            }
            .......
        } catch (SuperNotCalledException e) {
        } catch (Exception e) {
        }
        return activity;
    }
}
这里主要看40行, 调用了这个函数 mInstrumentation.callActivityOnCreate(activity, r.state),进去该函数看看:
public class Instrumentation {
    ......
      public void callActivityOnCreate(Activity activity, Bundle icicle) {
        ......
        activity.onCreate(icicle);
        ......
    }
.......
}
从这里看出回调到,Activity.onCreate函数。进去看看该函数:
public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory,
        Window.Callback, KeyEvent.Callback,
......
  protected void onCreate(Bundle savedInstanceState) {
        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
                com.android.internal.R.styleable.Window_windowNoDisplay, false);
        mCalled = true;
    }
    ......
}
没有特别的,就初始化了一些参数。:
我们在实现一个Activity组件的时候,也就是在实现一个Activity子类的时候,一般都会重写成员函数onCreate。
让我们来实现一个Activity子类。
public class MainActivity extends Activity{
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
我们创建一个Activity,都是在继承Activity,或者继承Activity的子类,在 mInstrumentation.callActivityOnCreate() 
函数里,调用的activity.onCreate(savedInstanceState)函数其实就是在回调了我们实现Activity子类。
至此,我们已经分析到,回调我们定义的Activity子类OnCreate的方法了,通常我们一般都会在onCreate方法里调用 
setContentView(R.layout.main);方法,正如MainActivity类那样。这个方法的调用的,就创建DecorView即Android应用程序窗口视图,
几个操作最重要的:
- 创建Activity
 - 创建ContextImpl
 - 创建PhoneWindow
 - 创建WindowManagerImpl
 - 回调Activity.onCreate()函数
 
通过一张时序图来总结这些重要操作创建的流程:

在时序图的第四步,创建了PhoneWindow,再去看看PhoneWindow创建的时序图:

                    
                
                
            
        
浙公网安备 33010602011771号