热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android面试题Context原理分析

本文配套视频配套视频源码分析相关面试题Volley源码分析注解框架实现原理okhttp3.0源码分析与XMPP相关面试题与XMPP相关试题一与XMPP相关试题二与性能优

本文配套视频


  • 配套视频

源码分析相关面试题


  • Volley源码分析
  • 注解框架实现原理
  • okhttp3.0源码分析

与XMPP相关面试题


  • 与XMPP相关试题一
  • 与XMPP相关试题二

与性能优化相关面试题


  • 与性能优化相关面试题一
  • 与性能优化相关面试题二
  • 与性能优化相关面试题三
  • 与性能优化相关面试题四
  • 与性能优化相关面试题五
  • 与性能优化相关面试题六
  • 与IPC机制相关面试题

与登录相关面试题


  • oauth认证协议原理
  • token产生的意义
  • 微信扫一扫实现原理

与开发相关面试题


  • 迭代开发的时候如何向前兼容新旧接口
  • 手把手教你如何解决as jar包冲突
  • context的原理分析

谈一下你对Android中的context的理解,在一个应用程序中有多少个context实例?


一、 什么是Context?

通过金山词霸解释:上下文环境,什么是环境,这个词只可意会不可言传,为了大家更好的理解,举一个栗子,比如:我想点鸡,我在麦当劳跟服务员说我想点鸡,服务员给端上来一只香喷喷的烤鸡,如下图:

但是我换一个环境 ,去红灯区点鸡,妈咪就会给带来一只呆萌可爱的失足少女,如下图:

这就是环境,一样的东西不同地方,就表示不一样的意思。


Context,中文直译为“上下文”,SDK中对其说明如下:

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for
application-level operations such as launching activities, broadcasting and receiving intents, etc

从上可知一下三点,即:
1)它描述的是一个应用程序环境的信息,即上下文。

2)该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。

3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息 等。。

首先看它们的继承关系


二、 什么时候创建Context实例

熟悉了Context的继承关系后,我们接下来分析应用程序在什么情况需要创建Context对象的?应用程序创建Context实例的情况有如下几种情况:

1) 创建Application 对象时, 而且整个App共一个Application对象
2) 创建Service对象时
3) 创建Activity对象时


因此应用程序App共有的Context数目公式为:


总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)


1、创建Application对象的Context:
首先新建一个MyApplication并让它继承自Application,然后在AndroidManifest.xml文件中对MyApplication进行指定,如下所示:

".MyApplication"android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >......
</application>

指定完成后&#xff0c;当我们的程序启动时Android系统就会创建一个MyApplication的实例,通过如下代码获取到它的实例:

public class MainActivity extends Activity {&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyApplication myApp &#61; (MyApplication) getApplication();Log.d("TAG", "getApplication is " &#43; myApp);}}

可以看到&#xff0c;代码很简单&#xff0c;只需要调用getApplication()方法就能拿到我们自定义的Application的实例了&#xff0c;打印结果如下所示&#xff1a;

那么除了getApplication()方法&#xff0c;其实还有一个getApplicationContext()方法&#xff0c;这两个方法看上去好像有点关联&#xff0c;那么它们的区别是什么呢&#xff1f;我们将代码修改一下&#xff1a;

public class MainActivity extends Activity {&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyApplication myApp &#61; (MyApplication) getApplication();Log.d("TAG", "getApplication is " &#43; myApp);Context appContext &#61; getApplicationContext();Log.d("TAG", "getApplicationContext is " &#43; appContext);}
}

同样&#xff0c;我们把getApplicationContext()的结果打印了出来&#xff0c;现在重新运行代码&#xff0c;结果如下图所示&#xff1a;

打印出的结果是一样的呀&#xff0c;连后面的内存地址都是相同的&#xff0c;看来它们是同一个对象。其实这个结果也很好理解&#xff0c;Application本身就是一个Context&#xff0c;所以这里获取getApplicationContext()得到的结果就是MyApplication本身的实例。

那么有的朋友可能就会问了&#xff0c;既然这两个方法得到的结果都是相同的&#xff0c;那么Android为什么要提供两个功能重复的方法呢&#xff1f;实际上这两个方法在作用域上有比较大的区别。getApplication()方法的语义性非常强&#xff0c;一看就知道是用来获取Application实例的&#xff0c;但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的&#xff0c;但是如果在一些其它的场景&#xff0c;比如BroadcastReceiver中也想获得Application的实例&#xff0c;这时就可以借助getApplicationContext()方法了&#xff0c;如下所示&#xff1a;

public class MyReceiver extends BroadcastReceiver { &#64;Override public void onReceive(Context context, Intent intent) { MyApplication myApp &#61; (MyApplication) context.getApplicationContext(); Log.d("TAG", "myApp is " &#43; myApp); } }

也就是说&#xff0c;getApplicationContext()方法的作用域会更广一些&#xff0c;任何一个Context的实例&#xff0c;只要调用getApplicationContext()方法都可以拿到我们的Application对象。


  • 欢迎关注微信公众号,长期推荐技术文章和技术视频


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文整理了Java中java.util.List.get()方法的一些代码示例,展示了List.get()的具体用法。这些代码示例主要来源于 ... [详细]
author-avatar
null
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有