我相信大家在android开发的过程中都遇到过这样的问题,特别是初级的android程序员,再启动Activity,弹出Dialog等的时候,使用的Context不是Activity的时候应用会报错,因为他们依赖于Activity。
今天正好看到了郭大侠的博客,有对这个的介绍,就简单的看了一下,现在转载一下,大家可以看看,理解理解
好了,言归正传,Context到底是什么呢?大家都知道,是上下文环境,那么上下文环境又是什么呢?
好,那么我们先来看一张图片,然后再理解一下:
我们可以看到,Context是站在实录连最顶层的男人,哈哈,开玩笑了,他下面还有ContextWrapper和ContextImpl,这俩我们或许不熟悉,没关系,我们继续往下看。在ContextWrapper下面是Application和Service,ContextThemeWrapper,最后就是Activity了。
好了,这下就很清楚了:
ContextWrapper是Context的封装类,而ContextImpl是他的实现类。
Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
由于Context的具体能力是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
Service和Activity大家应该都很熟悉,然后我们就讲一下比较容易被滥用的Application吧
对于Application大家应该都知道,程序一起来的时候他就会被初始化,我们可以使用它,但其实是很少的,只是用来做一些整个应用全局数据的初始化,但是好多项目却把它当作一个工具类来使用,之前公司项目的老代码就是这么做的,把一些数据存储啊,公共方法都放在这个里面,代码行数足足有好几千行,其实这个也没什么坏的影响,但是会让人觉得代码很不专业。
关于Application的初始化
public class MyApplication extends Application {
private static MyApplication app;
public static MyApplication getInstance() {
if (app == null) {
app = new MyApplication();
}
return app;
}
}
大家可以分析一下,这么些有什么问题,你可能会说,没什么问题啊,一个单例而已,其实这是大错特错的,通过这个方法获取的Application只是一个简单的类,并没有Context的属性,Application是一个系统的类,他是需要系统去创建的。
其实系统本身提供的Application就是一个单例,无需我们自己去多做什么。
public class MyApplication extends Application {
private static MyApplication app;
public static MyApplication getInstance() {
return app;
}
@Override
public void onCreate() {
super.onCreate();
app = this;
}
}
好了,这就是简单的对Context的理解,详情大家也可以去查看郭大侠的博客。
大侠博客直通车:http://blog.youkuaiyun.com/guolin_blog/article/details/47028975