Android面试笔记之常问的Context

前言

Context,在翻译为上下文,也可以理解为环境,是提供一些程序的运行环境基础信息。基本上在开发项目的时候,时刻都有接触到。Android程序不像Java程序,随便创建一个类,写个main()方法就能跑,而是要有一个完整的Android工程环境,在这个环境下,有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的上下文环境,也就是Context。可以说Context是维持Android程序中各组件能够正常工作的一个核心功能类。

Context是个抽象类,下图取自网络,可以看到Context的继承结构。

ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。

而ContextWrapper又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。

Context一共有三种类型,分别是Application、Activity和Service。

这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

Context应用场景:

NO上数字含义:

  1. 一个非Activity的Context可以用于启动一个Activity,但这样启动的Activity需要新创建一个Activity堆叠栈。这个在某些特定情形下或许会适用,一般情况不推荐。
  2. 这个其实也是可以的,但是这样导入的布局会用当前系统的默认主题来设置,若是自定义了某些样式可能不会被使用。
  3. 在Android 4.2及以上的系统里,若receiver为null,则允许,用于获取黏性广播的当前值。

每一个Activity和Service以及Application的Context都是一个新的ContextImpl对象。

getApplication()用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法,getApplicationContext()getApplication()方法的作用域会更广一些,任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象。

getBaseContext()方法得到的是一个ContextImpl对象。Application、Activity这样的类其实并不会去具体实现Context的功能,而仅仅是做了一层接口封装而已,Context的具体功能都是由ContextImpl类去完成的。

Context数量 = Activity数量 + Service数量 + 1 (1为Application)

最后注意下Context的引用,防止内存泄露问题,还有关于Context源码分析,网上还是很多资料可参考的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • Android编程中context及全局变量实例详解

    本文实例讲述了Android编程中context及全局变量的用法.分享给大家供大家参考,具体如下: 今天在研究context的时候,对application和activity context有了一定的了解,下面是从网上复制过来的资料 Application context和Activity context的区别: 这是两种不同的context,也是最常见的两种.第一种中context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随ap

  • Android中ContextMenu用法实例

    本文实例讲述了Android中ContextMenu用法.分享给大家供大家参考.具体如下: main.xml文件如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android" Android:orientation="vertical" And

  • 谈谈Android里的Context的使用实例

    大家好,今天给大家分享一下Android里的Context的一些用法,以前经常有人在群里问我比如我在一个工具类里的某个方法,或者View里需要调用Context.但是工具类还有View里没有这个上下文怎么办?为了解决大家的疑问,为了解决大家的疑问,我今天写一个简单的Demo.让大家如何学好自如的用Context.想什么时候有Context,什么时候就有Context. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Applicati

  • Android获取其他包的Context实例代码

    Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了一个包的Context对象,那我们基本上可以做这个包自己能做的大部分事情.那我们能得到吗?很高兴的告诉你,能!Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的. 这个方法有两个参数:1.packag

  • 深入解析Android App开发中Context的用法

    Context在开发Android应用的过程中扮演着非常重要的角色,比如启动一个Activity需要使用context.startActivity方法,将一个xml文件转换为一个View对象也需要使用Context对象,可以这么说,离开了这个类,Android开发寸步难行,对于这样一个类,我们又对他了解多少呢.我就说说我的感受吧,在刚开始学习Android开发时,感觉使用Context的地方一直就是传入一个Activity对象,久而久之感觉只要是Context的地方就传入一个Activity就行

  • android基础教程之context使用详解

    在android中有两种context,一种是application context,一种是activity context,通常我们在各种类和方法间传递的是activity context. 区别联系: 复制代码 代码如下: public class MyActivity extends Activity {    public void method() {       mContext = this;    // since Activity extends Context       m

  • 详解Android中的Context抽象类

    关于Context我们首先应该知道: (1)它描述的是一个应用程序环境的信息,即上下文. (2)该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类). (3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等.. 于是,我们可以利用该Context对象去构建应用级别操作(application-level operations) . 一.Co

  • Android编程获取全局Context的方法

    本文实例讲述了Android编程获取全局Context的方法.分享给大家供大家参考,具体如下: 有时,在处理业务逻辑的时候,需要Context对象,但在某些情况下,并非容易获取,这时就需要一些巧妙的手段来管理Context. 在Android中,提供了一个类Application,当应用程序启动的时候,系统会自动将这个类进行初始化,所以我们可以编写自己的Application类以管理一些全局的状态信息. 在这里,以获取全局Context为例. 1.编写自己的Application类 packag

  • 避免 Android中Context引起的内存泄露

    Context是我们在编写Android程序经常使用到的对象,意思为上下文对象. 常用的有Activity的Context还是有Application的Context.Activity用来展示活动界面,包含了很多的视图,而视图又含有图片,文字等资源.在Android中内存泄露很容易出现,而持有很多对象内存占用的Activity更加容易出现内存泄露,开发者需要特别注意这个问题. 本文讲介绍Android中Context,更具体的说是Activity内存泄露的情况,以及如何避免Activity内存泄

  • Android context源码详解及深入分析

    Android context详解 前言: Context都没弄明白,还怎么做Android开发? Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用Java语言,Activity本质上也是一个对象,那上面的写法有什么问题呢?估计很多人说不清道不明.Android程序不像Java程序一样,随便创建一个类,写个main()方法就能运行,Android应用模型是基

  • 安卓Android Context类实例详解

    1.例如下面的代码片段,Toast类的第一个参数接受一个Context对象: @Override protected Dialog onCreateDialog(int id) { switch (id) { case 0: Builder builder = new AlertDialog.Builder(this); builder.setIcon(R.drawable.ic_launcher); builder.setTitle("This is a dialog with some si

随机推荐