Android开发经常需要使用Context来启动Activity,或者打开SharedPreferences,或者构建一个Dialog。最近老是用到getContext(),getApplicationContext(),this等,来获取Context,故写此文来理清思路。确定好需要Context的时候,究竟用哪个函数。

Context

什么是Context呢?

个人的理解是:Context就是上下文,换句话说就是运行的环境。它可以用来新建对象,访问资源。

官方的参考文档,只有一段:

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.

这么一段说了3件事情(简单的翻译如下):

  1. 它是获取应用环境信息的接口。
  2. 它是一个抽象类,实现由安卓系统提供。
  3. 它允许访问application-specific的资源和类;执行应用级别的操作,比如开启一个activity。

获取Context的方法

获取Context的方法有如下几种:

  1. Activity类中使用this关键字
  2. SomeActivity.this
  3. 在Fragment中,可以getActivity()
  4. getContext()
  5. getApplicationContext()
  6. getBaseContext()

那么这几种获取Context对象的方式有什么异同?

首先将这些方法分类,按照使用的地方分类:

在Activity中可以使用的:

  1. Activity类中使用this关键字
  2. SomeActivity.this
  3. getApplicationContext()
  4. getBaseContext()

在Fragment中可以使用的:

  1. getContext()
  2. getActivity()

在View中可以使用的:

  1. getContext()

它们各自的含义

在Activity类中使用this关键字,等同于SomeActivity.this。

getApplicationContext() 获取整个应用的Context,获取的对象存活周期和应用一样长。

getContext() View中获取的是当前活动的Activity,Fragment中返回与之关联的Context

getActivity() 返回当前Fragment相关联的Activity

getBaseContext() 获取ContextWrapper的原始context

不管是Application,还是Activity,它们都继承了Context。

避免Context引起的内存泄漏

由Context引起的内存泄漏主要由两个原因:

  1. 引用了这个Context的对象存活时间长过传入的activity。
  2. 成员内部类和匿名内部类隐式持有外部类的对象导致。

第一种情况好理解,当activity销毁的时候,还有对象引用了这个activity,那么GC不会回收这个activity。
第二种情况的原因,参见链接4。讲的主要是内部类会隐式的持有外部类的对象导致GC不回收这个activity。在安卓中可能发生内存泄漏的地方是,一个activity里面有一个Runnable的运行还没结束,这个activity已经销毁了。但是这个activity被Runnabl隐式地持有,导致activity无法被回收。

既然如此,那就干脆不要用this好了!用getApplicationContext()不就好了?

但是,getApplicationContext()有其弊端!

链接3解释了不用getApplicationContext()的原因:它不是完整的Context。可能导致一些GUI相关的问题。比如AlertDialog.Builder不能使用getApplicationContext(),因为dialog需要一些主题相关的信息,而Application并不包含这些信息。(You need to use a Theme.AppCompat theme (or descendant) with this activity)

那么什么时候用getApplicationContext(),什么时候用this?
一般而言,如果context不需要ui相关的操作,就用getApplicationContext()。如果对象存活时间可能比activity长,考虑使用getApplicationContext()。其他情况,确保activity销毁前,取消引用activity,用this就好了。

参考链接

  1. https://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and#
  2. https://juejin.im/post/58cb97e1128fe1006c84aafe
  3. https://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context
  4. https://blog.csdn.net/leunging/article/details/53080863

【Android】Context的使用的更多相关文章

  1. Android Context 是什么?

    andorid 开发(42)  版权声明:本文为博主原创文章,未经博主允许不得转载. [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] PS ...

  2. Android Context介绍

    转载(Android Context完全解析与各种获取Context方法):https://www.cnblogs.com/chenxibobo/p/6136693.html

  3. Android Context上下文解析

    1.Context概念 Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源.启动一个新的Activity.获取系统 ...

  4. Android Context 上下文 你必须知道的一切

    本文转载于:http://blog.csdn.net/lmj623565791/article/details/40481055 转载请标明出处:http://blog.csdn.net/lmj623 ...

  5. 关于Android Context一些总结

    1.首先什么是context? 文档语焉不详,说是resource什么的,反正是没看懂,实际上可以认为它是一个指向parent对象的指针,受到那个parent对象的控制. 2.为什么需要context ...

  6. Android Context完全解析

    Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析, ...

  7. Android开发之Android Context,上下文(Activity Context, Application Context)

    转载:http://blog.csdn.net/lmj623565791/article/details/40481055 1.Context概念Context,相信不管是第一天开发Android,还 ...

  8. Android Context创建过程

        特定的资源或者类构成了Android应用程序的运行上下文环境 PackageManager, ClassLoader, Assert等等 Android应用程序窗口的运行上下文环境是通过Con ...

  9. android Context的理解

    很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释:  Context字面意思上下文,位于framework ...

  10. Android Context MODE的四种模式解析(转)

    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...

随机推荐

  1. 理解并运用TP5.1-Facade

    1.内容介绍 深入解析tp5.1与laravel 中Facade底层原理实现 1. 什么是Facade 2. 为什么需要有什么好处 3.  Facade实现原理 4. 功能实现. 5. 容器注入 2. ...

  2. CSS 让div,span等块级、非快级元素排列在同一行

    让div,span等块级.非快级元素排列在同一行 by:授客 QQ:1033553122 例子:让两个div排列在同一行 给div添加float样式 <!DOCTYPE html> < ...

  3. HttpWebRquest.GetRequestStreamAsync()发生延迟

    前景提要:此问题不定适用Browser通信方式,主要提供给通信发生异常时解决思路. Q: request请求创建过程发生延迟 [Scene]: ​ .Net的HttpWebRquest.GetRequ ...

  4. [转]Blue Prism Opening a password protected Excel workbook?

    本文转自:https://www.rpaforum.net/threads/opening-a-password-protected-excel-workbook.470/ 问: As the tit ...

  5. Dynamics CRM命令栏定制基础知识及手动编辑customization.xml实例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复166或者20151028可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的博文:Dynamics C ...

  6. python的exe反编译

    目录 python的exe反编译 方法一.使用archive_viewer.py提取pyc 方法二.使用pyinstxtractor.py提取pyc python的exe反编译 驱动人生样本为pyth ...

  7. opencv-python 图像处理(五)

    Canny边缘检测 1) 使用高斯滤波器,以平滑图像,滤除噪声. 2) 计算图像中每个像素点的梯度强度和方向. 3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测 ...

  8. [b0044] numpy_快速上手

    1 概念理清 2 创建数组 2.1 f1= np.array( [ [1,2,3,4], [2,3,4,5], [3,4,5,6] ]) 其他代码 a= np.array([ [ [3.4,5,6,8 ...

  9. 43-安装 Docker Machine

    前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和销毁,相关容器会通过网络 ...

  10. Linux ssh突然连接不了的案例浅析

    公司的Linux服务器都是通过一台JumpServer跳转的.个人使用Jumpserver(开源跳板机系统)时,有时候由于需要上传.下载文件很不方便.而由于配置关系,一般情况无法使用SecureCRT ...