到底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关闭了我们就无法销毁这个界面的上下文,回收内存。

所以在使用的时候要注意具体的使用场景,避免内存泄漏问题。

results matching ""

    No results matching ""