差异和何时使用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); 

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

现在混淆的是不同情境的声明和具体用法。 为了简单起见,您应该在Android框架中计算两种types的上下文。

  1. 应用上下文
  2. 活动上下文

应用程序上下文被附加到应用程序的生命周期,并在应用程序的整个生命周期中始终保持相同。 所以,如果你使用Toast ,你可以使用应用程序上下文,甚至活动上下文(两者),因为可以在应用程序中的任何地方引发吐司,而不是附加到窗口。

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

现在引用您的案例:

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

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

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

getBaseContext()提供活动上下文。

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

Waqas的答案非常清晰和完整,但是我想进一步阐明使用'this'和getBaseContext()之间的区别,或者getApplication()和getApplicationContext()。 Activity和Application都不是Context本身,而是ContextWrapper,它是一个“代理上下文的实现,它将所有调用简单地委托给另一个上下文”。 这个“真实的”上下文是你使用getBaseContext()得到的。

因此,尽pipe“this”(对于Activity)和getBaseContext()都给出了活动上下文,但他们(a)不会引用同一个对象(this!= getBaseContext())和(b)效率不高,因为通话需要额外的间接。 不过,我怀疑它有什么实际的区别。

getApplication()和getApplicationContext()同样适用。

 LoginActivity.this 

上面的行是Obeveously一个上下文的一个活动。当你创build一些AlertDialogs时使用这个…在某些地方它的强制性,你使用活动上下文…

 getApplication() 

同样在这里make文本方法需要上下文和应用程序本身实现Context

 getApplicationContext() 

这是自Context生效直到应用程序closures的最佳方式。

 getBaseContext() 

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

但是他们都给出了一个Context对象,没有其他的东西。

如果您的类inheritance,则使用此类。使用getapplication()引用应用程序和应用程序扩展应用程序上下文getbasecontext()引用您的活动上下文上下文参考您的活动生命周期上下文applicationcontext引用您的应用程序生命周期