Activity运行上下文环境Context的创建过程

Activity运行上下文环境Context的创建过程

Activity继承Context,当Activity子类调用Activity方法时,就会间接进入Context的方法,要调用Context方法就要先创建Context,接下来看一下创建Context的过程,此过程与创建AppLication Context的过程相似:

Created with Raphaël 2.1.2 ActivityThread ActivityThread Instrumentation Instrumentation Activity Activity ContextThemeWrapper ContextThemeWrapper ContextWrapper ContextWrapper scheduleLaunchActivity handleLaunchActivity performLaunchActivity newActivity createBaseContextForActivity attach attachBaseContext attachBaseContext callActivityOnCreate performCreate onCreate

从scheduleLaunchActivity,handleLaunchActivity,performLaunchActivity这几个方法和创建Application Context是一样的,不在赘述,newActivity创建了一个Activity对象,createBaseContextForActivity创建了一个ContextImpl对象,把activity赋值给mOuterContext对象

 private Context createBaseContextForActivity(ActivityClientRecord r, final Activity activity) {
        int displayId = Display.DEFAULT_DISPLAY;
        try {
            displayId = ActivityManagerNative.getDefault().getActivityDisplayId(r.token);
        } catch (RemoteException e) {
        }

        ContextImpl appContext = ContextImpl.createActivityContext(
                this, r.packageInfo, displayId, r.overrideConfig);
        appContext.setOuterContext(activity);
        Context baseContext = appContext;

接下来下面这句code是将appContext赋值给mBase对象,

activity.attach(appContext, this, getInstrumentation(), r.token,
 r.ident, app, r.intent, r.activityInfo, title, 
 r.parent, r.embeddedID, r.lastNonConfigurationInstances,
  config, r.referrer, r.voiceInteractor);

在attach方法中,首先调用attachBaseContext方法,把创建的ContextImpl对象赋值给mBase,然后创建PhoneWindow对象,并且把该对象赋值给Activity类的mWindow,该PhoneWindow对象用来表示当前正在启动的Activity的应用程序窗口,是android中一个非常重要的概念,该应用窗口中还有个DecorView对象,他会是Activity跟视图。
应用程序的activity在运行的过程中,其中PhoneWindow对象会接收到一些事件,如按键,触摸屏事件等,这些事件需要转发给与它相关联的activity来处理,转发通过Window.Callback接口来实现,而Activity实现了Window.Callback接口,attach方法,把目前正在启动的activity通过类PhoneWindow的setCallBack方法设置到新创建的PhoneWindow中。
在android系统里,每个应用程序窗口都需要一个窗口管理者来管理,因此,attach方法最后还会调用setWindowManager方法来为应用程序窗口PhoneWindow设置一个窗口管理者,在这是窗口管理者后,通过Window的getWindowManager方法获得管理者对象,并且赋值给Activity类的变量mWindowManager ,这样,目前正在启动的activity同样可以通过变量mWindowManager 来管理与它相关联的窗口

  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,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
        attachBaseContext(context);

        mFragments.attachHost(null /*parent*/);

        mWindow = new PhoneWindow(this);
        mWindow.setCallback(this);
        mWindow.setOnWindowDismissedCallback(this);
        ...
        mWindow.setWindowManager(
                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
                mToken, mComponent.flattenToString(),
                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
        if (mParent != null) {
            mWindow.setContainer(mParent.getWindow());
        }
        mWindowManager = mWindow.getWindowManager();
        mCurrentConfig = config;

创建完Activity Context后会调用Instrumentation 类的callActivityOnCreate方法,进入Activity的onCreate方法,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值