安卓中getApplicationContext(),getApplication(),this的区别

源码解析

这里写图片描述
从图中我们可以看到Context和它的家族们。
Context作为基类。一般来说都是抽象的。一个ContextWrapper。一个ContextImpl分别是它的子类。
我们来看一下getApplicationContext()源码。

    @Override
    public Context getApplicationContext() {
        return mBase.getApplicationContext();
    }

首先调用getApplicationContext方法就调用了ContextWrapper的getApplicationContext方法。而mBase是什么呢?

public class ContextWrapper extends Context {
    Context mBase;
    ...
    }

原来是父类。但是不对啊父类是抽象的。哪实现的?其实在ContextImp中实现。

    @Override
    public Context getApplicationContext() {
        return (mPackageInfo != null) ?
                mPackageInfo.getApplication() : mMainThread.getApplication();
    }

mPackageInfo 是对apk的管理。我再看看。

mPackageInfo.getApplication()

    Application getApplication() {
        return mApplication;
    }

mApplication是Application的引用。
mMainThread.getApplication();

    public Application getApplication() {
        return mInitialApplication;
    }

mInitialApplication也是Application的引用。

getApplicationContext和getApplication区别?

那么也就是说getApplicationContext返回的是Application对象。
而getApplication返回的也是Application对象。
也就是这两个方法都可以获取全局application对象。生命周期长,只要应用存活它就存在。

其实,从图中可以看到,BroadCastReceiver和Service是不继承Context的。也就是说,我们在这两个组件中用到Context是getApplicationContext。getApplication只在Activity和Service中用到。

而getApplication能获取到在xml标签中的application。我们从来不会调用getApplicationContext来获取。
有时候可能会需要一些全局数据,来让应用中得所有Activity和View都能访问到
,会自定义一个application�%25BD%25A5继承Application。我们可以在Activity中使用getApplication(),方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等。

Activity中的this?

Activity实际上是应用程序context上下文的一个子集。
Activity中的this指代的是activity对象。在匿名内部类中通常使用。activity类名.this来指代本体。也就是随着activity的生命周期存在而存在。

getBaseContext()?

public class ContextWrapper extends Context {
    Context mBase;
    ...
      public Context getBaseContext() {
        return mBase;
      }
    ...
    }

从代码中我们可以看到getBaseContext拿到的也是Context。
从我所知道的来看,尽量要自己的Context,通过getBaseContext拿到这个context,可能是再android sdk开发中会用到吧。

总结

从这几方面我们来看。能用activity的就用activity的上下文,否则生命周期过长会导致一些泄漏问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值