`
zzu_007
  • 浏览: 22414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Acitivy创建Context的过程(二)

阅读更多
page4
在这里我们分析一下ContextImpl的init函数的具体实现:
final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) {
        init(packageInfo, activityToken, mainThread, null, null, Process.myUserHandle());
    }

1     final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread,
2             Resources container, String basePackageName, UserHandle user) {
3         mPackageInfo = packageInfo;
4         mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName;
5         mResources = mPackageInfo.getResources(mainThread);
6
7         if (mResources != null && container != null
8                 && container.getCompatibilityInfo().applicationScale !=
9                         mResources.getCompatibilityInfo().applicationScale) {
10             if (DEBUG) {
11                 Log.d(TAG, "loaded context has different scaling. Using container's" +
12                         " compatiblity info:" + container.getDisplayMetrics());
13             }
14             mResources = mainThread.getTopLevelResources(
15                     mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY,
16                     null, container.getCompatibilityInfo());
17         }
18         mMainThread = mainThread;
19         mActivityToken = activityToken;
20         mContentResolver = new ApplicationContentResolver(this, mainThread, user);
21         mUser = user;
22     }

init函数的主要逻辑就是初始化主要的成员变量
page5
activity的attach函数的定义如下, 注意下面是两个函数:
1     final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
2             Application application, Intent intent, ActivityInfo info, CharSequence title,
3             Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances,
4             Configuration config) {
5         attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
6             lastNonConfigurationInstances, config);
7     }
8    
9     final void attach(Context context, ActivityThread aThread,
10             Instrumentation instr, IBinder token, int ident,
11             Application application, Intent intent, ActivityInfo info,
12             CharSequence title, Activity parent, String id,
13             NonConfigurationInstances lastNonConfigurationInstances,
14             Configuration config) {
15         attachBaseContext(context);
16
17         mFragments.attachActivity(this, mContainer, null);
18        
19         mWindow = PolicyManager.makeNewWindow(this);
20         mWindow.setCallback(this);
21         mWindow.getLayoutInflater().setPrivateFactory(this);
22         if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
23             mWindow.setSoftInputMode(info.softInputMode);
24         }
25         if (info.uiOptions != 0) {
26             mWindow.setUiOptions(info.uiOptions);
27         }
28         mUiThread = Thread.currentThread();
29        
30         mMainThread = aThread;
31         mInstrumentation = instr;
32         mToken = token;
33         mIdent = ident;
34         mApplication = application;
35         mIntent = intent;
36         mComponent = intent.getComponent();
37         mActivityInfo = info;
38         mTitle = title;
39         mParent = parent;
40         mEmbeddedID = id;
41         mLastNonConfigurationInstances = lastNonConfigurationInstances;
42
43         mWindow.setWindowManager(
44                 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
45                 mToken, mComponent.flattenToString(),
46                 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
47         if (mParent != null) {
48             mWindow.setContainer(mParent.getWindow());
49         }
50         mWindowManager = mWindow.getWindowManager();
51         mCurrentConfig = config;
52     }

第15行(Activity->attach)调用attachBaseContext函数, 关于attachBaseContext函数的详细分析可以参考page6文件.
调用完attachBaseContext函数我们明白了, Activity拿着ContextImpl, 而ContextImpl也拿着这个Activity
page6
在这篇文章里, 我们分析一下Activity的attachBaseContext函数的具体逻辑, 其实attachBaseContext函数是从Activity的父类ContextThemeWrapper继承而来的,
我们先来看一下ContextThemeWrapper类的继承体系,
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context

那么ContextThemeWrapper的attachBaseContext函数的具体实现如下:
1     @Override protected void attachBaseContext(Context newBase) {
2         super.attachBaseContext(newBase);
3         mBase = newBase;
4     }

第2行(ContextThemeWrapper->attachBaseContext)调用父类ContextWrapper的attachBaseContext函数:
1 protected void attachBaseContext(Context base) {
2 if (mBase != null) {
3     throw new IllegalStateException("Base context already set");
4 }
5 mBase = base;
6     }
ContextWrapper的attachBaseContext函数会设置成员变量mBase, 使之指向一个Context对象, 也就是ContextImpl了.
ContextWrapper的成员变量mBase的定义如下:
Context mBase;

第3行(ContextThemeWrapper->attachBaseContext)又会初始化成员变量mBase, 我靠!咋又有一个!
ContextThemeWrapper的mBase的定义如下:
private Context mBase;

分享到:
评论

相关推荐

    Android启动APP时黑屏白屏的解决方法

    首先系统的服务会先检查startActivity中的intent的信息,然后在去创建进程,最后才是执行启动Acitivy的操作。而我们上面提到的显示白黑屏的问题,就是在这段时间内产生的。 系统在绘制页面加载布局之前,首先会初始...

    Android Service中使用Toast无法正常显示问题的解决方法

    在做Service简单练习时,在Service中的OnCreate、OnStart、OnDestroy三个方法中都像在Activity中同样的方法调用了Toast.makeText,并在Acitivy中通过两个按钮来调用该服务的onStart和onDestroy方法: DemoService...

    node-v12.18.3-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    用于高级分析的阿联酋汽车市场销售数据

    通过我们最新收集的数据集,释放阿联酋充满活力的汽车市场的潜力,该数据集于2024年4月12日更新。该主要数据集来源于dubizzle.com,提供了阿拉伯联合酋长国当前汽车销售的全面快照,为汽车市场趋势和消费者偏好提供了宝贵的见解。

    基于Python+opencv+keras+numpy+sklearn的人脸识别门禁系统.zip

    基于OpenCV的系统

    美国大学生数学建模竞赛简介

    美国大学生数学建模竞赛(MCM/ICM),简称“美赛”,是一项由美国数学及其应用联合会(COMAP)主办的国际性数学建模竞赛。该竞赛自1985年创办以来,已经成为全球范围内极具影响力的数学建模竞赛之一,旨在鼓励大学生团队应用数学知识解决实际问题,提升学生的数学建模能力、科研能力以及团队合作精神。 美赛作为一项国际性的学术竞赛,对参赛学生的数学、英语、论文写作和科研能力有很高的要求。竞赛通常要求三人一组,在四天内完成从建立数学模型、求解、验证到撰写论文的全过程。竞赛题目覆盖经济、管理、环境、资源、生态、医学、安全等多个领域。

    Blackmagic SmartView SmartScope Duo 4K SmartView 4K 五月 安装和操作手册

    Blackmagic SmartView SmartScope SmartView Duo SmartScope Duo 4K SmartView 4K 五月 2021 安装和操作手册

    unity开发入门教程.zip

    Unity是一个流行的跨平台游戏开发引擎,它允许开发者使用C#等语言创建2D和3D游戏。以下是一个Unity开发的基本入门教程: 1. 安装Unity 首先,你需要从Unity的官方网站下载并安装Unity Hub和Unity编辑器。Unity Hub是一个用于管理Unity版本和项目的工具。 2. 创建新项目 打开Unity Hub,点击“New”来创建一个新项目。选择你需要的Unity版本、模板(例如2D或3D)和其他设置。 3. 熟悉Unity界面 Unity的界面主要由以下几个部分组成: Hierarchy:显示场景中的所有游戏对象。 Project:显示项目的所有资源,如场景、模型、材质、脚本等。 Inspector:显示当前选中游戏对象的详细信息和属性。 Scene:显示当前场景的3D视图,你可以在这里编辑游戏对象。 Game:显示游戏运行时的视图。

    根据各种因素预测一个地区发生洪水的概率设计代码

    根据各种因素预测一个地区发生洪水的概率。

    python 3.9.19源码编译包

    python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包python 3.9.19源码编译包

    信息技术填空选择100题

    总结出了信息技术课程常考的100道填空题,答案在花括号内。制卷时只需要将花括号及其中的内容替换成圆括号即可。

    数据结构实验代码中国象棋马(上机实验).rar

    数据结构实验代码

    一篇基础的Scratch语言教程

    一篇基础的Scratch语言教程 Scratch 是一种面向青少年的图形化编程语言,由麻省理工学院(MIT)的终身幼儿园团队开发。它通过拖放代码块的方式,使得编程教育变得更加直观和有趣。以下是一篇基础的Scratch语言教程,适合初学者入门。

    第五次作业函数第一题代码

    第五次作业函数第一题--

    node-v12.22.10-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于扩散概率模型在无监督OCT去噪中的应用.zip

    本项目聚焦于基于扩散概率模型在无监督光学相干断层扫描(OCT)去噪中的应用。OCT是一种高分辨率的医学影像技术,常用于视网膜、心血管等疾病的诊断。 传统的OCT去噪方法往往需要依赖于带有清晰图像的监督学习,而本项目则探索在无监督环境下,利用扩散概率模型对OCT图像进行去噪。该方法无需清晰的图像作为监督,能够有效减少对大量标注数据的依赖。 在数据集方面,我们使用了公开的OCT影像数据集,如OCT2017等,并进行了预处理,包括图像裁剪、大小调整和归一化等。在环境搭建方面,我们使用Python编程语言,基于TensorFlow和PyTorch深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对OCT图像的无监督去噪,提高医学影像的清晰度和可用性,为相关疾病的诊断和治疗提供有力支持。同时,项目成果也可应用于其他无监督去噪任务。

    福禄克 1550B 兆欧表 用户手册 FLUKE 1550B MegOhmMeter

    福禄克 1550B 兆欧表 用户手册

    星间飞行二次元角色研修课程-课程网盘链接提取码下载 .txt

    本课程旨在深入探讨二次元角色设计理念,引导学员掌握角色塑造技巧与创作方法。通过案例分析与实践训练,学员将学习角色设定、情感表达等关键要素,提升角色创作能力,激发创意潜能,打造独具魅力的二次元角色形象。 课程大小:6.4G

    node-v12.16.1-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    BRD母婴需求文档(产品需求文档及原型图都市孕妈项目).docx

    BRD母婴需求文档(产品需求文档及原型图都市孕妈项目).docx

Global site tag (gtag.js) - Google Analytics