两种上下文

介绍

在程序中我们可以理解上下文为当前对象在应用程序中所处的一个环境,一个与系统交互的过程。Android系统中提供了上下文对象Context,Application,Activity,Service 均继承自Context。

Android应用程序会在下面几个时间点上创建上下文对象:

  • 创建Application的时候
  • 创建Activity的时候
  • 创建Service的时候

系统在创建Application的时候创建的是ApplicationContext,在创建Activity和Service的时候,创建的是Activity和Service实例的Context,Android系统中的Context分为以上两种。

应用场景

  • 当显示对话框的时候,用到的是活动的上下文

  • 当显示吐司,得到SharedPreference,数据库的时候,用到的是整个应用程序的上下文。

当显示对话框的时候,如果用整个应用程序的上下文,会出现如下错误:

1
2
3
4
AlertDialog.Builder builder = new Builder(this);//如果传递进去的是getApplationContext()则会报下面的错误

03-30 04:01:48.632: ERROR/AndroidRuntime(4841):
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

原因分析:
Dialog窗体(对话框窗体)是Activity的一部分。然而,通过getApplationContext()方法获取的上下文是属于整个应用程序的,而Activity.this,则是获得当前的Activity的上下文,如果是通过getApplationContext()方法获取的上下文,那么系统就不知道当前的这个窗体要挂载在那个Activity上(因为gerApplationContext是属于整个应用程序的)。

两种上下文的区别:

对于getApplationContext,我们可以假定他是一个父类,(它属于整个应用程序所共有),Activity.this,可以假定为getApplationContext的一个子类(当前Activity的上下文),该子类中包含了一些特殊的引用(相对于父类来说,功能更加的完善)。所以,一般可以用到getApplationContext()的地方,就可以用Activity.this来替代。

生命周期上:
applicationcontext 生命周期: 进程存在 上下文就存在

activity.this activity 生命周期: 当活动在任务栈的时候,上下文存在

应用场景上:
如果我们要通过一个上下文来执行某个动作,且希望动作一直处于“活跃”状态,那么应当考虑使用getApplationContext来获取上下文对象。例如当使用数据库的时候,需要传递进去一个上下文,如果传递进去的是Activity.this,那么当Activity执行onDestroy()方法的时候,数据库就会关闭,应用程序会出错。但如果使用getApplationContext()方法来获取上下文对象,然后将其传递进去,那么就可以避免上述的错误。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器