到底getApplicationContext和getApplication是不是返回同一个对象?
getApplicationContext和getApplication返回的是不是同一个对象?答:是的!
当然话不能说的那么死,他们相同的前提是mApplication不为空,话又说回来,这个是全局的上下文,
程序都启动了他怎么会为空呢,至于它到底什么情况会为空造成返回的对象不一样呢
从getApplicationContext和getApplication再次梳理Android的Application正确用法
Application的获取问题,一个方法是我们直接 (MyApplication)getApplication(),但是还有一种更常见的做法,要在其他没有Context的地方也能拿到怎么办呢?可以这样,仿照单例的做法(只是仿照!),在MyApplication声明一个静态变量
public class MyApplication extends Application {
private static MyApplication instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
// 获取ApplicationContext
public static Context getMyApplication() {
return instance;
}
至此我们拿到了MyApplication实例,注意这跟我们常见的单例不一样,不要自作聪明去在getMyApplication里面做一下空的判断,Application在应用中本来就是一个单例,所以每次返回的都是同一个实体,原文如下:
There is normally no need to subclass Application. In most situation,
static singletons can provide the same functionality in a more modular way.
总结
Application,Activity,Service都是继承自Context,是应用运行时的环境,我们可以把Application看做是应用,Activity看做是一个界面,至于getApplicationContext和getApplication,他们返回的对象有可能不一样(虽然大部分时间是一样的,都是整个应用的上下文),如果想要拿到在manifest里面声明的那个Application,务必用getApplication
还有就是因为他们都继承自Context,比如在打开Dialog的时候好像是都可以,其实不然,比如我们大多数情况:
AlertDialog.Builder builder = new Builder(Activity.this);//可以
AlertDialog.Builder builder = new Builder(getApplicationContext());//内存泄漏
如果把this换成getApplicationContext(),不会报错,但是就如我们刚才所说,getApplicationContext() 返回的上下文会随着应用一直存在,这里如果Activity关闭了我们就无法销毁这个界面的上下文,回收内存。
所以在使用的时候要注意具体的使用场景,避免内存泄漏问题。