`
zzu_007
  • 浏览: 23881 次
  • 性别: 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...

    基于智能温度监测系统设计.doc

    基于智能温度监测系统设计.doc

    搜广推推荐系统中传统推荐系统方法思维导图整理-完整版

    包括userCF,itemCF,MF,LR,POLY2,FM,FFM,GBDT+LR,阿里LS-PLM 基于深度学习推荐系统(王喆)

    2023-04-06-项目笔记 - 第三百五十五阶段 - 4.4.2.353全局变量的作用域-353 -2025.12.22

    2023-04-06-项目笔记-第三百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.353局变量的作用域_353- 2024-12-22

    和美乡村城乡融合发展数字化解决方案.docx

    和美乡村城乡融合发展数字化解决方案.docx

    CNN基于Python的深度学习图像识别系统

    基于Python的深度学习图像识别系统是一个利用卷积神经网络(CNN)对图像进行分类的先进项目。该项目使用Python的深度学习库,如TensorFlow,构建和训练一个模型,能够自动识别和分类图像中的对象。系统特别适合于图像处理领域的研究和实践,如计算机视觉、自动驾驶、医疗影像分析等。 项目的核心功能包括数据预处理、模型构建、训练、评估和预测。用户可以上传自己的图像或使用预定义的数据集进行训练。系统提供了一个直观的界面,允许用户监控训练进度,并可视化模型的性能。此外,系统还包括了一个模型优化模块,通过调整超参数和网络结构来提高识别准确率。 技术层面上,该项目使用了Python编程语言,并集成了多个流行的机器学习库,如NumPy、Pandas、Matplotlib等,用于数据处理和可视化。模型训练过程中,系统会保存训练好的权重,以便后续进行模型评估和预测。用户可以通过简单的API调用,将新的图像输入到训练好的模型中,获取预测结果。

    拳皇97.exe拳皇972.exe拳皇973.exe

    拳皇97.exe拳皇972.exe拳皇973.exe

    基于python和协同过滤算法的电影推荐系统

    基于python和协同过滤算法的电影推荐系统 基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法的电影推荐系统基于python和协同过滤算法

    DEV-CPP-RED-PANDA

    DEV-CPP-RED-PANDA

    Python语言求解旅行商(TSP)问题,算法包括禁忌搜索、蚁群算法、模拟退火算法等

    Python语言求解旅行商问题,算法包括禁忌搜索、蚁群算法、模拟退火算法等。

    pdfjs2.5.207和4.9.155

    pdfjs 用于在浏览器中查看/预览/打印pdf。 pdfjs 2.5.207 支持firefox/chrome/edge/ie11以上版本。 如果需要支持旧版本浏览器,可以使用这个,是未修改过的原版,支持打印和下载按钮。亲测有效。 pdf 4.9.155分两个包: pdfjs-4.9.155-dist.zip pdfjs-4.9.155-legacy-dist.zip

    建设项目现场高温人员中暑事故应急预案.docx

    建设项目现场高温人员中暑事故应急预案

    数据结构上机实验大作业-线性表选题.zip

    数据结构上机实验大作业-线性表选题.zip

    基于高德地图的校园导航全部资料+详细文档+高分项目.zip

    【资源说明】 基于高德地图的校园导航全部资料+详细文档+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    全自动批量建站快速养权重站系统【纯静态html站群版】:(GPT4.0自动根据关键词写文章+自动发布+自定义友链+自动文章内链+20%页面加提权词)

    【静态站群程序视频演示,只有视频,不含程序,下载须知】【静态站群程序视频演示,只有视频,不含程序,下载须知】全自动批量建站快速养权重站系统【纯静态html站群版】:(GPT4.0自动根据关键词写文章+自动发布+自定义友链+自动文章内链+20%页面加提权词)

    9.30 SWKJ 男头7张+女头2张.zip

    9.30 SWKJ 男头7张+女头2张.zip

    基于java+springboot+vue+mysql的技术交流和分享平台 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、vscode 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    一个通过单片机在各种屏幕上显示中文的解决方案.7z

    一个通过单片机在各种屏幕上显示中文的解决方案.7z

    Halcon模板匹配图像包

    图像

Global site tag (gtag.js) - Google Analytics