文档章节

this 和 getApplicationContext Context的区别

拉风的道长
 拉风的道长
发布于 2012/09/18 22:49
字数 898
阅读 2043
收藏 5

转自:http://stackoverflow.com/questions/1026973/android-whats-the-difference-between-the-various-methods-to-get-a-context

In various bits of Android code I've seen:
在大量的android代码中,我看到如下的写法:

public class MyActivity extends Activity {
public void method() {
mContext = this; // since Activity extends Context
mContext = getApplicationContext();
mContext = getBaseContext();
}
}

However I can't find any decent explanation of which is preferable, and under what circumstances which should be used.
不过,我不能找到任何像样的解释:那种写法是最好的,在哪种情况应使用哪种写法。

Pointers to documentation on this, and guidance about what might break if the wrong one is chosen, would be much appreciated.
如果你有关于这方面的文章的地址,和关于如果选择错误的写法会产生的错误的指导,将不胜感激。

I agree that documentation is sparse when it comes to Contexts in Android, but you can piece together a few facts from various sources.
我承认,涉及android中Contexts的文章凤毛麟角,但是,我们还是可以从各种来源中拼凑出东西的。

This blog post on the official Google Android developers blog was written mostly to help address memory leaks, but provides some good information about contexts as well:
这个谷歌官方的Android开发者写,主要是为了帮助解决内存泄漏,的博客文章,同时也给contexts提供了一些良好的信息:

In a regular Android application, you usually have two kinds of Context, Activity and Application.
在一个普通的Android应用程序中,你通常有两种Context,Activity和Application。

Reading the article a little bit further tells about the difference between to the two and why you might want to consider using the application Context (Activity.getApplicaitonContext()) rather than using the Activity context ("this"). Basically the Application context is associated with the Applicaiton and will always be the same throughout the life cycle of you app, where as the Activity context is associated with the activity and could possible be destroyed many times as the activity is destroyed during screen orientation changes and such.
如果再深入读下这篇文章,它告诉了我们这两种Context的不同,并且为什么你会考虑使用应用程序Context(Activity.getApplicaitonContext())而不是使用活动Context(即"this")。 基本上来说呢,应用程序Context是和应用程序关联的,并且在程序的生命周期内,总是一样的。但是,活动Context是关联在某个活动上的,随着Activity的销毁(比如横竖屏切换等情况),这个Context也会被销毁N多次。

I couldn't find really anything about when to use getBaseContext() other than / from one /(a for a) liner from Dianne Hackborn, one of the Google engineers working on the Android SDK:
我真的没有找到任何关于使用 getBaseContext()的东西,除了Dianne Hackborn(一位编写Android SDK的谷歌工程师)的文章中的一句话:

Don't use getBaseContext(), just use the Context you have.
不要使用getBaseContext(),只使用你有的Context。

That was from a post on the android-developers newsgroup, you may want to consider asking your question there as well because a handful of the people working on Android actual monitor that newsgroup and answer questions.
那是来自 android-developers 新闻组的一篇邮件。你也可以考虑在那里问你的问题,因为确实有一大帮搞Android的人在管理这个小组,并且回答问题。

So overall it seems preferable to use the global application context when possible.
所以,总体来说,似乎最好在可能的情况下使用全局应用程序Context。

I got bad window token errors when using application context to Progress Dialog. So i used activity context instead.
我使用应用程序Context给进度条对话框的时候,出现了“window token errors”的错误。所以,我使用了活动Context,而不是应用程序Context。

PS:
Pointers to documentation on this, and guidance about what might break if the wrong one is chosen, would be much appreciated.
如果你有关于这方面的文章的地址,和关于如果选择错误的写法会产生的错误的指导,将不胜感激。

© 著作权归作者所有

拉风的道长
粉丝 54
博文 110
码字总数 55629
作品 0
昌平
程序员
私信 提问
加载中

评论(4)

carlos
carlos

引用来自“Mr.CT”的评论

I got bad window token errors when using application context to Progress Dialog. So i used activity context instead.
我使用应用程序Context给进度条对话框的时候,出现了“window token errors”的错误。所以,我使用了活动Context,而不是应用程序Context。

为什么用Application Context报错?不是最好用Application Context吗?
因为对话框只能的依赖activity
拉风的道长
拉风的道长

引用来自“Mr.CT”的评论

I got bad window token errors when using application context to Progress Dialog. So i used activity context instead.
我使用应用程序Context给进度条对话框的时候,出现了“window token errors”的错误。所以,我使用了活动Context,而不是应用程序Context。

为什么用Application Context报错?不是最好用Application Context吗?

对话框只能用activity的context,不然会报错。
其他情况用Application context。
Mr.CT
Mr.CT
I got bad window token errors when using application context to Progress Dialog. So i used activity context instead.
我使用应用程序Context给进度条对话框的时候,出现了“window token errors”的错误。所以,我使用了活动Context,而不是应用程序Context。

为什么用Application Context报错?不是最好用Application Context吗?
yuanhotel
yuanhotel
不错。
Caused by: android.view.WindowManager$BadTokenExce

有时候,如果采用getApplicationContext()传入Context,会出现如上错误。此时若采用传入当前activity.this,则不会出错。 两者的区别是: getApplicationContext()返回应用的上下文,其生命...

一别经年
2014/01/21
0
0
Android 中的Context

什么是Context Context是一个抽象基类,我们通过它访问当前包的资源(getResources、getAssets)和启动其他组件(Activity、Service、Broadcast)以及得到各种服务(getSystemService),当然...

YoungerDev
2017/10/02
0
0
Context的完全的解析

Context的完全的解析 1.Context的使用场景 我们回想一下,你在加载资源、启动一个新的Activity、Service、获取系统服务、获取内部文件(夹)路径、创建View操作时等都需要Context的参与,可见...

android-key
2016/11/23
3
0
android学习—— context 和 getApplicationContext()

在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求传递的 参数就是一个context,在这里我们传入...

sw3458856
2014/04/29
0
0
android学习—— context 和 getApplicationContext()

Context,中文直译为“上下文”。 浅论一下 context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求传递的 参数就是一个context,在这里我们传入的是thi...

fjabing
2014/02/19
125
0

没有更多内容

加载失败,请刷新页面

加载更多

八、RabbitMQ的集群原理

集群架构 写在前面 RabbitMQ集群是按照低延迟环境设计的,千万不要跨越WAN或者互联网来搭建RabbitMQ集群。如果一定要在高延迟环境下使用RabbitMQ集群,可以参考使用Shovel和Federation工具。...

XuePeng77
今天
1
0
mac系统下,brew 安装mysql,用终端可以连接,navicat却连接不上?

问题: 1.报错? 2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found 2.自己通过设置,已经把密......

写bug的攻城狮
昨天
2
0
老生常谈,HashMap的死循环

问题 最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。 由于HashMap...

群星纪元
昨天
5
0
拉普拉斯算子

拉普拉斯算子是二阶微分算子。 我们知道,一维离散信号一阶微分公式如下: 相应的,一维离散信号二阶微分公式如下: 由于图像有x和y两个方向,因此图像信号属于二维离散信号。其在x,y两个...

yepanl
昨天
3
0
记录"正则表达式"

详细请查看我的博客:https://blog.enjoytoshare.club/article/RegularExpression.html 1 写在前面 正则表达式(Regular Expression)在代码中常常简写为regex。正则表达式通常被用来检索、替...

wugenqiang
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部