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

时间:2012-04-27 08:19:27

标签: android android-intent this toast 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();

与意图相同:

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 个答案:

答案 0 :(得分:196)

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

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

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

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

    现在提到您的案例:

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

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

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

    getBaseContext()提供活动背景。

      

    提示:每当您需要操纵Views时,请继续操作   活动 - 上下文,否则应用程序上下文就足够了。

答案 1 :(得分:24)

Waqas的答案非常明确和完整,但我想进一步澄清使用thisgetBaseContext()getApplication()与{{1}之间的区别}。 getApplicationContext()Activity都不是Application本身,而是Context,这是

  

“代理ContextWrapper的实施,只是将其所有来电委托给另一个Context”。

使用Context即可获得“真实”上下文。

尽管getBaseContext()(对于this)和Activity都给出了活动背景,但它们

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

同样的逻辑适用于thisgetApplication()

答案 2 :(得分:6)

LoginActivity.this 

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

getApplication()

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

getApplicationContext()

这是首选方式,因为此Context会一直存在,直到应用程序关闭。

getBaseContext()

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

但他们所有人都提供了一个上下文对象而没有别的......

答案 3 :(得分:0)

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