谈一谈对Context的了解

作者:神秘网友 发布时间:2021-01-12 20:21:44

谈一谈对Context的了解

  • 应用里面有多少个Context?不同的Context之间有什么区别?
  • Activity中的this和getBaseContext有什么区别?
  • getApplication和getApplicationContext有什么区别?
  • 应用组件的构造、onCreate、attachBaseContext的调用顺序?

在Android中,只有Application、Activity以及Service有自己的Context。

Application的Context

谈一谈对Context的了解

我们知道Application的Context是伴随着Application的创建而创建的,AMS在需要启动应用进程的时候,通过本地socket通知Zygote来fork应用进程,应用进程在启动完成之后,会通过Binder机制向AMS报告“我已经启动好了”,AMS在接收到该Binder调用之后,会立即通过Binder调用通知应用进程创建Application。

应用在创建Application的时候,首先通过ClassLoader加载对应的class文件,并通过newInstance创建一个应用的Application对象,这样就经过了Application的构造函数,同时应用进程还会实例化一个Context对象,通过Application对象的attachBaseContext方法赋值给Application,这些都做完之后,应用进程才会调用Application对象的onCreate方法。这里需要注意,Application中的context其实只是一个空壳,真正起作用的是应用进程通过attachBaseContext赋值的mBase,Application的context其实是mBase的静态代理。

Application的总结

  • 继承关系:Application - ContextWrap - Context
  • 调用顺序:构造函数 - attachBaseContext - onCreate

ContextWrap中包含了一个Context(mBase变量,是应用进程通过attachBaseContext赋值的),Application中关于Context的调用都是委托给它

Activity的Context

Activity中Context也是类似于Application的,应用通过ClassLoader加载Activity的class文件,通过newInstance创建一个Activity对象,此时就通过了Activity的构建函数,再之后应用为Activity创建一个Context对象,并通过Activity对象的attch函数赋值到Activity对象的上下文变量mBase,最后调用onCreate。

  • 继承关系:Activity - ContextThemeWrap - ContextWrap - Context
  • 调用顺序:构造函数 - attachBaseContext - onCreate

Service的Context

和Activity以及Application一样,Service启动时调用的顺序:

  • 构造函数 - attachBaseContext - onCreate

广播BroadcastReceiver没有继承自其他的类,广播的Context分两种,当以动态广播注册(context.registerReceiver)的时候,BroadcastReceiver就是依托的Context,静态广播的Context是以Aplication的mBase为基类的ContextWrap。

ContentProvier也没有继承自其他的类,ContentProvider中的Context是Application初始化的时候传入的,传入的就是Application的Context,这里需要注意的是,ContentProvider的初始化是在Application的构造函数以及attachBaseContext之后进行的,但是ContentProvider的onCreate函数是在Application的onCreate之前。

应用里面有多少个Context?不同的Context之间有什么区别?

上面的分析可以知道只有Application、Activity、Service有Content,应用中Context的数量就等于Application数量,加上Activity的数量,再加上Service的数量,不过这里需要注意,Application是跟进程的,应用中启动多少个进程就会相应的床架多少个Application。各个Context的区别在于,Activity这种需要展示界面UI的,Context是继承自ContextThemeWrap,而没有界面UI显示的就直接继承自ContentWrap。

Activity中的this和getBaseContext有什么区别?

Activity是继承自ContextWrap的,Activity的this返回的就是Activity自己,而getBaseContext返回的是ContextWrap中的mBase,this和getBaseContext返回的是两个不同的ContextWrap,只不过前者this的调用处理最终都是托管给getBaseContext的mBase进行处理的。

getApplication和getApplicationContext有什么区别?

getApplication是Activity和Service中特有函数,可以获得进行的Application的对象,而getApplicationContext是ContextWrap中的抽象类。

应用组件的构造、onCreate、attachBaseContext的调用顺序?

Application、Activity以及Service的这三个生命周期函数调用的顺序都是一样的,首先通过ClassLoader加载对应的class文件,然后通过newInstance函数访问到组件的构造函数初始化一个组件对象,创建一个ContextImpl对象,通过组件的attachBaseContext函数将Context对象赋值给组件内部的mBase,继而调用组件的onCreate。

谈一谈对Context的了解 相关文章

  1. 关于动态规划你该了解这些!

    2021年的第一个工作日,我们正式开启动态规划系列,老录友们都知道「代码随想录」的传统,新系列开始,一定是先讲理论基础! 刚来的录友可能会着急想刷题,别急哈,耐心把基础篇看完,你一定会有所收获! 我已经将刷题攻略全部整理到了Github :https://gith

  2. 23个需要了解的十分有用的nodejs库(推荐)

    相关推荐:《node js教程》 作为专业的开发人员,我们必须不断更新最新和最好的库,因为知道好的库,那么开发过程就可以依赖于它们,这会节省我们很多时间也有助于构建高质量的软件。 下面列表常见且好用的 NodeJS 库,反正我自己是已经收藏了,以备将来会用

  3. 了解javascript中3种for循环风格以及何时使用它们

    在学习任何开发语言时候,for循环是必不可少的一种语法,可能所有开发人员都会使用它。它非常经典,以至于每个开发语言都至少包括一种关于循环的语法版本。不过,在JavaScript种包含了三种不同的循环语法(如果再讲究一点,也可以算作是四种)。 它们的使用

  4. 甲骨文宣布正式介入存储业务超融合架构须基于对业务的深刻了解

    简介: 原文: http://www.dostor.com/article/121038036.html 2015年12月10日,由DOIT传媒、存储在线和易会联合主办的2015中国存储年度峰会在北京盛大开幕。作为中国存储界有影响力的年度行业盛会,峰会以“把握数据经济,重塑商业变革”为主题,吸引了上百

  5. 了解浏览器中的不同存储类型

    在后端开发中,存储是工作的常见部分。应用程序数据存储在数据库中,文件存储在对象存储中,瞬态数据存储在高速缓存中……似乎存在无限种存储任何类型数据的可能性。但是, 数据存储不仅限于后端 ,前端(浏览器)还具有许多存储数据的选项。我们可以通过利

  6. 了解Node.js中的模块系统

    相关推荐:《node js教程》 Node.js 的模块 JavaScript 做为一门为网页添加交互功能的简单脚本语言问世,在开始并不包含模块系统,随着 JavaScript 解决问题越来越复杂,把所有代码写在一个文件内,用 function 区分功能单元已经不能支撑复杂应用开发了,ES6

  7. 了解如何编写JavaScript

    javascript栏目介绍如何编写JavaScript。 相关免费学习推荐:JavaScript(视频) JavaScript的入门文章: 如果你已经会写html与css了,但是你还没学JavaScript那么你就可以从笔者的这边文章开始学起了。 JavaScript是在JS引擎中执行的 V8引擎。 JavaScript在

  8. 了解浏览器渲染网页的每个步骤机制!

    我的想法:如果我要构建快速可靠的网站,需要真正了解浏览器渲染网页的每个步骤机制,这样就可以在开发过程中对每个步骤进行优化。 这篇文章是我在较高水平上对端到端过程的学习总结。 好了,废话不多说,我们开始吧。这个过程可以分为以下几个主要阶段: 开

  9. 了解Python的collections.Counter类型

    python视频教程栏目介绍Python的collections.Counter类型。 collections.Counter 类型可以用来给可散列的对象计数,或者是当成多重集合来使用 —— 多重集合就是集合里的元素可以出现多次1。 collections.Counter 类型类似于其它编程语言中的 bags 或者 mult

  10. 了解javascript有必要使用服务端渲染吗

    javascript学习教程栏目介绍是否使用服务端渲染。 前言 前阵子有搞了 React 服务端渲染的项目,是否应该用这个主要还是看场景吧。 比较适用于大家常说的 SEO 和首屏渲染这些,一般都是 toc 的业务才会需要用到。 同构 现代框架的服务端渲染和 jsp、php 这些

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词