131

我是 android 新手,我正在尝试了解getApplication()getApplicationContext()和之间的区别getBaseContext(),尤其是何时在以下代码行中使用这些方法:getContext()someClass.this

当我启动 toast 时,它们之间有什么区别,在哪些情况下我使用它们?

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);
4

4 回答 4

230

ToastIntent都需要参考上下文。而getApplicationgetApplicationContextLoginActivity.thisgetBaseContext,它们都提供对上下文的引用。

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

  1. 应用程序上下文
  2. 活动背景

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

Activity上下文附加到 Activity 的生命周期,并且可以在 ActivityonDestroy()被引发时销毁。如果要启动一个新活动,则必须在其Intent中使用活动的上下文,以便新启动的活动连接到当前活动(在活动堆栈方面)。但是,您也可以使用应用程序的上下文来启动新活动,但是您需要设置标志Intent.FLAG_ACTIVITY_NEW_TASK以将其视为新任务。

现在参考您的案例:

LoginActivity.this虽然它指的是你自己的类,它扩展了 Activity 类,但基类(Activity)也扩展了 Context 类,所以它可以用来提供活动上下文。

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

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

getBaseContext()提供活动上下文。

提示:每当您需要操作时Views,请使用 Activity-Context,否则Application-Context就足够了。

于 2012-04-27T08:30:31.207 回答
28

Waqas 的回答非常清楚和完整,但是我想进一步澄清使用thisvs.getBaseContext()getApplication()vs.之间的区别getApplicationContext()。两者ActivityApplication都不是扩展Context自身,而是ContextWrapper,这是一个

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

那个“真实”的上下文是你使用getBaseContext().

因此,尽管this(for Activity) 和getBaseContext()两者都给出了活动上下文,但它们

  • (a) 不引用同一个对象 ( this != getBaseContext()) 和
  • (b) 调用上下文this的效率略低,因为调用经过了额外的间接级别。不过,我怀疑它是否有任何实际区别。

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

于 2012-11-23T07:13:34.360 回答
6
LoginActivity.this 

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

getApplication()

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

getApplicationContext()

这是最首选的方式,因为它会一直Context持续到应用程序关闭。

getBaseContext()

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

但是它们都给出了一个Context对象,没有别的了。

于 2012-04-27T08:32:10.580 回答
0

Class.this 如果您的类扩展 Activity 使用 getapplication() 使用参考应用程序和应用程序扩展应用程序上下文 getbasecontext() 参考您的活动上下文上下文参考您的活动生命周期上下文 applicationcontext 参考您的应用程序生命周期

于 2015-09-24T05:30:41.253 回答