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创建的时序图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值