Chinaunix首页 | 论坛 | 博客
  • 博客访问: 143821
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 326
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-26 10:49
个人简介

记忆总是会慢慢褪去,所以让文字记住一切~

文章分类

全部博文(23)

文章存档

2017年(5)

2016年(3)

2015年(9)

2014年(6)

我的朋友

分类: Android平台

2017-02-26 16:29:59

浅谈一下Context

Android中我们经常调用一些函数的时候需要传入context对象,如
在语句 AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity())中,要求传递的参数就是一个context,在这里我们传入的是getActivity()返回的对象,那么这个究竟指的是什么呢?
 很明显,我们调用Dialog的地方一般在一个Fragment或Activity中,Fragment其实寄宿于Activity,归根结底Dialog是在寄宿在Activity上的View上面,那它需要传入的是Activity这个上下文。这个地方我们就不可以使用getApplicationContext()来返回给Dialog。

这里涉及到一个生命周期的问题,getApplicationContext()取的是这个应用程序的Context,getActivity()获取的就是这个Activity的Context,这两者的生命周期是不同的,前者的生命周期是整个应用程序的运行期间,应用摧毁它就会被摧毁;后者的生命周期只是它所在的Activity,Activity被摧毁它就不存在了。正是由于AlertDialog是属于一个Activity的,在Activity销毁的时候它也就销毁了,不会再存在;但是,如果传 入应用程序的Context,就表示它的生命周期是整个应用程序,这显然超过了它 的生命周期了。 
========
AlertDialog.Builder(getApplicationContext())时会发生如下错误:

E/AndroidRuntime(5844): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

=========
P.S.

  • getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁
  • Activity.this或者getActivity()的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁
  • getBaseContext()  返回由构造函数指定或setBaseContext()设置的上下文

阅读(2604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~