以及何时使用 getApplication()、 getApplicationContext()、 getBaseContext()和 somClass.this

我是 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);
62002 次浏览

吐司 意图,都需要参考 背景。而 GetApplicationGetApplicationContextLoginActivity.thisGetBaseContext,它们都提供了上下文的参考。

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

  1. 应用环境
  2. 活动内容

Application 上下文附加到应用程序的生命周期中,并且在应用程序的整个生命周期中始终相同。因此,如果您正在使用 干杯,您可以使用应用程序上下文或甚至活动上下文(两者) ,因为烤面包可以从应用程序中的任何地方引发,而且不附加到窗口。

Activity 上下文连接到 Activity 的生命周期,如果活动的 onDestroy()被提高,则可以销毁它。如果您想要启动一个新的活动,您必须在活动的 意图中使用活动的上下文,以便新的启动活动连接到当前活动(就活动堆栈而言)。但是,您也可以使用应用程序的上下文来启动一个新活动,但是之后您需要设置 Intent.FLAG_ACTIVITY_NEW_TASK标志,以便将其视为一个新任务。

现在谈谈你们的案子:

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

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

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

getBaseContext()提供活动上下文。

提示: 每当你需要操作 Views,然后去 活动-上下文 ,否则 应用-内容就足够了

LoginActivity.this

上面这行是一个活动,显然是一个上下文。.这是用来创建一些警报对话框... 在某些地方,它的强制使用活动上下文..。

getApplication()

同样,make text 方法需要 Context,Application 本身实现 Context

getApplicationContext()

这是最好的方式,因为这个 Context的生命,直到应用程序关闭。

getBaseContext()

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

但是它们都给出了一个 背景对象,除此之外什么都没有。

Waqas 的答案非常清楚和完整,但是我想进一步澄清使用 thisgetBaseContext()或者 getApplication()getApplicationContext()之间的区别。ActivityApplication都不延伸 Context本身,而是延伸 ContextWrapper

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

“真正的”上下文是通过使用 getBaseContext()得到的。

因此,尽管 this(对于 Activity)和 getBaseContext()都给出了活动上下文,但是它们

  • (a)不引用同一物体(this != getBaseContext())及
  • (b)通过 this调用上下文的效率稍低,因为调用要经过额外的间接级别。不过我觉得这没什么实际意义。

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

如果您的类扩展 Activity,则使用 Class.this Getapplication ()用于引用应用程序和应用程序扩展应用程序上下文 Getbasecontext ()引用您的活动上下文 上下文是指您的活动生命周期上下文 Applicationcontext 指的是你的应用程序生命周期