本文主要是介绍安卓中getApplicationContext(),getApplication(),this的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
源码解析
从图中我们可以看到Context和它的家族们。
Context作为基类。一般来说都是抽象的。一个ContextWrapper。一个ContextImpl分别是它的子类。
我们来看一下getApplicationContext()源码。
@Overridepublic Context getApplicationContext() {return mBase.getApplicationContext();}
首先调用getApplicationContext方法就调用了ContextWrapper的getApplicationContext方法。而mBase是什么呢?
public class ContextWrapper extends Context {Context mBase;...}
原来是父类。但是不对啊父类是抽象的。哪实现的?其实在ContextImp中实现。
@Overridepublic 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的上下文,否则生命周期过长会导致一些泄漏问题。
这篇关于安卓中getApplicationContext(),getApplication(),this的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!