区别以及何时使用getApplication(),getApplicationContext(),getBaseContext()和someClass.this


121

我是新来的Android和我想明白之间的差别getApplication()getApplicationContext(getBaseContext()getContext()以及someClass.this特别是当使用这些方法在下面的代码行:

当我敬酒时,这些和在什么情况下使用它们有什么区别?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

与意图相同:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);


它们仅处理context和baseContext。但我想了解它们在2个顶点中的所有用法。谢谢
Pheonix7'4

Answers:


215

ToastIntent都需要引用上下文。还有getApplicationgetApplicationContextLoginActivity.thisgetBaseContext,它们都提供了对上下文的引用。

现在,令人困惑的是不同上下文及其特定用法的声明。为简单起见,您应该计算Android框架中可用的两种上下文。

  1. 应用环境
  2. 活动背景

应用程序上下文附加到应用程序的生命周期,并且在应用程序的整个生命周期中始终是相同的。因此,如果您正在使用Toast,则可以使用应用程序上下文,甚至可以使用活动上下文(两者),因为Toast可以从应用程序中的任何位置引发,并且不附加到窗口。

活动上下文附加到活动的生命周期,如果onDestroy()引发活动,则可以将其破坏。如果要启动新的活动,则必须在其Intent中使用活动的上下文,以便新的启动活动连接到当前活动(就活动堆栈而言)。但是,您也可以使用应用程序的上下文来启动新活动,但随后需要设置标志Intent.FLAG_ACTIVITY_NEW_TASK以将其视为新任务。

现在参考您的案例:

LoginActivity.this 尽管它指的是扩展Activity类的您自己的类,但是基类(Activity)也扩展了Context类,因此可以用来提供活动上下文。

getApplication() 尽管它引用了Application对象,但是Application类扩展了Context类,因此可以用来提供应用程序上下文。

getApplicationContext() 提供应用程序上下文。

getBaseContext() 提供活动上下文。

提示:每当您需要进行操作时,都Views可以使用 Activity-Context,否则只要Application-Context就足够了。


11
因此,如果我做对了,someClass.this,getBaseContext和getContext()是活动顶点,而getApplicationContext()和getApplication()是应用程序顶点?
Pheonix12年

上下文仅仅是有关环境的信息吗?
committedandroider

是的,就像托管应用程序的沙盒一样
waqaslam 2014年

@committedandroider,因为活动上下文包含有关所选主题的额外信息,因此在代码中创建视图时,将自动应用正确的主题。有关更多信息,您可以阅读此内容
waqaslam 2014年

@waqaslam指的是android sdk类Context-> ContextWrapper-> 1. Application&2 .- ContextThemeWrapper> Activity; 和getBaseContext()是的方法ContextWrapper,所以getBaseContext() offers activity context.还有Application Context太多......是不是?
布罗

26

Waqas的答案非常清楚和完整,但是我想进一步阐明使用thisvs. getBaseContext()getApplication()vs. 之间的区别getApplicationContext()。双方ActivityApplication延长不是Context本身,而是ContextWrapper,这是一个

“该代理的实现Context只是将其所有调用委托给另一个Context”。

该“真实”上下文是您通过使用获得的getBaseContext()

因此,尽管this(和ActivitygetBaseContext()都提供了活动上下文,但它们

  • (a)不要引用相同的对象(this != getBaseContext()),并且
  • (b)通过上下文进行调用的this效率稍低,因为调用会经过额外的间接级别。我怀疑这是否有实际的区别。

同样的逻辑也适用于getApplication()getApplicationContext()


至于getBaseContext()而言,谷歌的Android开发者提出这样的:“不要使用getBaseContext(),只需使用你的语境。” 因此,实际上,他们建议您使用this“活动”。
ChuongPham 2012年

这是getBaseContext我在互联网上找到的最清晰的解释。谢谢!!
q126y

6
LoginActivity.this 

上面的行是一个Activity,它显然是一个Context ..当您创建一些AlertDialogs ...时使用它。在某些地方,您必须使用Activity Context...。

getApplication()

同样,这里的make text方法需要Context和Application本身实现 Context

getApplicationContext()

这是最可取的方式,因为这种方式一直Context存在,直到应用程序关闭。

getBaseContext()

此上下文可用于小部件和视图。

但是所有这些对象都提供了一个Context对象,仅此而已。


所以在祝酒消息中或创建意图时,尽管使用getApplicationContext()最正确,但它们都具有相同的效果?
Pheonix7 2012年

1
@Hassan Samii:对于Toast,您可以getApplicationContext()在所有情况下使用,但最好this在Activity中制作Toast时使用。
ChuongPham 2012年

0

Class.this,如果您的类扩展了Activity getapplication(),则引用应用程序,应用程序扩展了应用程序上下文,getbasecontext(),引用您的活动上下文上下文,引用了您的活动生命周期,上下文,applicationcontext,引用了您应用程序的生命周期,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.