【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 ...
随机推荐
- C# HttpClient 请求认证、数据传输笔记
目录 一,授权认证 二,请求类型 三,数据传输 C# HttpClient 请求认证.数据传输笔记 一,授权认证 客户端请求服务器时,需要通过授权认证许可,方能获取服务器资源,目前比较常见的认证方式有 ...
- Implement Property Value Validation in Code 在代码中实现属性值验证(XPO)
This lesson explains how to set rules for business classes and their properties. These rules are val ...
- 个性化windows10主题/换成winxp主题
win10系统主题手动更换为仿winXp系统主题 突然想念家里那台被遗忘了好久的旧电脑,思绪被拉回小时候偷玩电脑的场景. 如果你也是一个念旧的人的话,我相信你一定喜爱Windows XP的经典界面. ...
- 简单sql注入学到的延时盲注新式攻击
0x01 知识点 mysql_pconnect(server,user,pwd,clientflag) mysql_pconnect() 函数打开一个到 MySQL 服务器的持久连接. mysql_p ...
- 手把手教你避开组件cover-view的那些坑
腾讯位置服务基于微信提供的小程序插件能力,专注于(围绕)地图功能,打造一系列小程序插件,可以帮助开发者简单.快速的构建小程序,是您实现地图功能的最佳伙伴.目前微信小程序插件提供路线规划.地铁图.地图选 ...
- 树莓派 raspbian Linux 系统命令行 快捷键
在 Linux 下使用命令操作的时候,光标的移动令人头痛.命令输入完了,执行之后发现缺少权限,然后不得不移动光标到行首加 sudo,而命令又极长……当我学会了命令行相关的快捷键之后,不仅效率提高了,更 ...
- RDMA 相关 简要摘录
RDMA (Remote Direct Memory Access) 全称为 远程直接内存访问 其出现的目的:为了解决网络传输中服务端数据处理的延迟而产生的.其将数据直接从一台计算机的内存传输到另一台 ...
- go语言设计模式之observer
observer.go package observer import ( "fmt" ) type Observer interface { Notify(string) } t ...
- request请求参数与http请求过程
request请求参数
- CF1244C The Football Season
题目链接 problem 给定\(n,p,w,d\),求解任意一对\((x,y)\)满足\[xw+yd=p\\ x + y \le n\] \(1\le n\le 10^{12},0\le p\le ...