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方法,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activity上下文Activity Context)是Android开发中的一个重要概念,它指的是在特定的Activity中可用的资源和数据。在Android中,每个Activity都有自己的上下文,这个上下文包含了该Activity中可以使用的各种资源,如布局文件、图像、音频、颜色、字体等,以及用于操作数据和与系统交互的回调方法。 Activity上下文的用途非常广泛,它可以用于以下几种情况: 1. 加载布局:Activity上下文包含了当前的布局资源,可以用来加载和显示布局。 2. 访问资源:通过Activity上下文,可以在Activity中访问到各种资源,如布局文件、图像、音频、颜色、字体等。 3. 访问本地数据:Activity上下文可以用来访问存储在设备上的本地数据,如SharedPreferences或文件系统中的数据。 4. 处理用户输入:Activity上下文可以用来处理用户的输入事件,如按键、触摸等。 5. 执行系统级操作:Activity上下文提供了与系统交互的方法,如打开其他应用、发送广播、接收广播等。 需要注意的是,Activity上下文是与特定的Activity关联的,当Activity被销毁或跳转到其他Activity时,其上下文也会随之消失。因此,在Activity中访问的资源或数据需要在Activity生命周期内进行管理,以避免出现意外情况。同时,在使用Activity上下文时,也需要注意权限和安全性问题,以避免潜在的安全风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值