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

Phe*_*ix7 116 android this toast android-intent android-context

我是新来的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();
Run Code Online (Sandbox Code Playgroud)

与意图相同:

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);
Run Code Online (Sandbox Code Playgroud)

waq*_*lam 206

ToastIntent都需要引用上下文.和getApplication,getApplicationContext,LoginActivity.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就足够了.

  • 所以,如果我做对了,someClass.this,getBaseContext和getContext()是活动上下文,而getApplicationContext()和getApplication()是应用程序上下文? (11认同)

小智 25

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

"代理实现Context它只是将所有调用委托给另一个Context".

这种"真实"的背景是你通过使用得到的getBaseContext().

因此,虽然this(for Activity)和getBaseContext()两者都给出了活动背景,但它们

  • (a)不要引用同一个对象(this != getBaseContext())和
  • (b)呼叫上下文的this效率稍差,因为呼叫经过了额外的间接.不过,我怀疑它是否有任何实际意义.

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

  • 就 `getBaseContext()` 而言,Google 的 Android 开发人员建议:“不要使用 getBaseContext(),只需使用您拥有的 Context。” 因此,实际上,他们建议您将“this”用于“活动”。 (2认同)

nge*_*esh 6

LoginActivity.this 
Run Code Online (Sandbox Code Playgroud)

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

getApplication()
Run Code Online (Sandbox Code Playgroud)

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

getApplicationContext()
Run Code Online (Sandbox Code Playgroud)

这是最优选的方式,因为它一直Context存在,直到应用程序关闭.

getBaseContext()
Run Code Online (Sandbox Code Playgroud)

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

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