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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了差异以及何时使用getApplication(),getApplicationContext(),getBaseContext()和someClass.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);
答案

Toast和Intent都需要引用上下文。和getApplication,getApplicationContext,LoginActivity.this和getBaseContext一样,它们都提供了对上下文的引用。

现在令人困惑的是声明不同的上下文及其具体用法。为简单起见,您应该计算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就足够了。

另一答案

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

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

通过使用getBaseContext()获得的“真实”背景。

因此,尽管this(对于Activity)和getBaseContext()都给出了活动背景,

  • (a)不要指同一个物体(this != getBaseContext())和
  • (b)通过this调用上下文的效率略低,因为调用通过了额外的间接级别。不过,我怀疑它是否有任何实际意义。

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

另一答案
LoginActivity.this 

上面的行是一个活动,它是一个上下文。这是在你创建一些AlertDialogs时使用的......在某些地方它必须使用Activity Context ...

getApplication()

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

getApplicationContext()

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

getBaseContext()

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

但是他们所有人都提供了一个Context对象而没有别的东西。

另一答案

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

以上是关于差异以及何时使用getApplication(),getApplicationContext(),getBaseContext()和someClass.this的主要内容,如果未能解决你的问题,请参考以下文章

Java 泛型接口与泛型方法,以及何时使用其中一种

ResultSet 与 RowSet:选择哪一个以及何时选择?

AWS EFS vs EBS vs S3(差异和何时使用?)[关闭]

无法在商店或视图中使用 getApplication()

Ref和Out之间的差异是啥? [复制]

Java NIO 与 IO