【Android】Context的使用
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件事情(简单的翻译如下):
- 它是获取应用环境信息的接口。
- 它是一个抽象类,实现由安卓系统提供。
- 它允许访问application-specific的资源和类;执行应用级别的操作,比如开启一个activity。
获取Context的方法
获取Context的方法有如下几种:
- Activity类中使用this关键字
- SomeActivity.this
- 在Fragment中,可以getActivity()
- getContext()
- getApplicationContext()
- getBaseContext()
那么这几种获取Context对象的方式有什么异同?
首先将这些方法分类,按照使用的地方分类:
在Activity中可以使用的:
- Activity类中使用this关键字
- SomeActivity.this
- getApplicationContext()
- getBaseContext()
在Fragment中可以使用的:
- getContext()
- getActivity()
在View中可以使用的:
- getContext()
它们各自的含义
在Activity类中使用this关键字,等同于SomeActivity.this。
getApplicationContext() 获取整个应用的Context,获取的对象存活周期和应用一样长。
getContext() View中获取的是当前活动的Activity,Fragment中返回与之关联的Context
getActivity() 返回当前Fragment相关联的Activity
getBaseContext() 获取ContextWrapper的原始context
不管是Application,还是Activity,它们都继承了Context。
避免Context引起的内存泄漏
由Context引起的内存泄漏主要由两个原因:
- 引用了这个Context的对象存活时间长过传入的activity。
- 成员内部类和匿名内部类隐式持有外部类的对象导致。
第一种情况好理解,当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就好了。
参考链接
- https://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and#
- https://juejin.im/post/58cb97e1128fe1006c84aafe
- https://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context
- https://blog.csdn.net/leunging/article/details/53080863
【Android】Context的使用的更多相关文章
- Android Context 是什么?
andorid 开发(42) 版权声明:本文为博主原创文章,未经博主允许不得转载. [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] PS ...
- Android Context介绍
转载(Android Context完全解析与各种获取Context方法):https://www.cnblogs.com/chenxibobo/p/6136693.html
- Android Context上下文解析
1.Context概念 Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源.启动一个新的Activity.获取系统 ...
- Android Context 上下文 你必须知道的一切
本文转载于:http://blog.csdn.net/lmj623565791/article/details/40481055 转载请标明出处:http://blog.csdn.net/lmj623 ...
- 关于Android Context一些总结
1.首先什么是context? 文档语焉不详,说是resource什么的,反正是没看懂,实际上可以认为它是一个指向parent对象的指针,受到那个parent对象的控制. 2.为什么需要context ...
- Android Context完全解析
Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析, ...
- Android开发之Android Context,上下文(Activity Context, Application Context)
转载:http://blog.csdn.net/lmj623565791/article/details/40481055 1.Context概念Context,相信不管是第一天开发Android,还 ...
- Android Context创建过程
特定的资源或者类构成了Android应用程序的运行上下文环境 PackageManager, ClassLoader, Assert等等 Android应用程序窗口的运行上下文环境是通过Con ...
- android Context的理解
很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释: Context字面意思上下文,位于framework ...
- Android Context MODE的四种模式解析(转)
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...
随机推荐
- Go-内置time包
一.导入包 import "time" 二.转换成Time对象 获取当前时间:time. Now () 自定义时间:time. Date(year int, month Month ...
- [Go] 在golang中使用正则表达式捕获子表达式
正则匹配并且可以捕获到()这个里面的子表达式的值,linux的grep命令没办法捕获子表达式的值,只能获取到整条正则匹配的内容 package main import "regexp&quo ...
- Docker启动守护式容器
目录 启动守护式容器 查看容器日志 docker后台运行 查看容器内运行的进程 查看容器内部细节 进入正在运行的容器并以命令行交互 重新进入 上述两个区别 从容器内拷贝文件到主机上 启动守护式容器 ...
- Python学习一、一个小例子
一.题目: 对于一串氨基酸序列(由字母表前二十个大写字母组成),需要得到每一个氨基酸数目,然后输出到文件夹D:\test\frq.txt,要求用循环和字典实现. 氨基酸序列如下: ABCDEFGHIJ ...
- 【转】bootstrap table轻松实现数据表格
在使用bootstrap table时可能在很多时候回用的表格来显示数据,如果自己写那肯定没问题,但是数据展示出来就麻烦多了,然而bootstrap table 封装了一套完善的数据表格组件,把从后台 ...
- 2019-2020-1 20199305《Linux内核原理与分析》第四周作业
MenuOS的构造 一.Linux源代码的关键目录 block:存放块设备管理代码: crypto:存放常见加密算法的C语言代码: Documentation:存放一些文档: drivers:驱动目录 ...
- commons-httpclient 和 httpclient 区别
今天在看项目的pom的时候,发现里面有这么两个包依赖. <dependency> <groupId>commons-httpclient</groupId> < ...
- iOS:捋一遍View的生命周期
一.介绍 前面介绍了VC的生命周期,闲着没事也来捋一捋View的生命周期,简单用两个类型的View来监测.一个View纯代码创建,另一个View使用Xib创建. 二 .代码 MyCodeView: ...
- js 元素自动点击/执行问题
a标签对于一下两种方式是无效的: <a href="http://qq.com">QQ</a> $('.obj').click(); $('.obj').t ...
- IT兄弟连 Java语法教程 位运算符
Java定义了几个位运算符,它们都可以用于整数类型(long.int.short.byte以及char).这些运算符对操作数的单个位进行操作.表1 对位运算符进行了总结. 表1 位运算符 由于位运算 ...