我试图理解 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 回答
Toast 和 Intent ,都需要引用上下文 . 并且 getApplication , getApplicationContext , LoginActivity.this 和 getBaseContext ,它们都提供了对上下文的引用 .
现在令人困惑的是声明不同的上下文及其具体用法 . 为简单起见,您应该计算Android框架中可用的两种类型的上下文 .
应用程序上下文
活动背景
Application 上下文附加到应用程序的生命周期中,并且在应用程序的整个生命周期中始终相同 . 因此,如果您正在使用Toast,则可以使用应用程序上下文甚至活动上下文(两者),因为可以从应用程序中的任何位置引发Toast,并且不会将其附加到窗口 .
Activity 上下文附加到Activity 's life-cycle and can be destroyed if the activity' s
onDestroy()
被引发 . 如果要启动新活动,则必须在其Intent中使用活动的上下文,以便新的启动活动连接到当前活动(就活动堆栈而言) . 但是,您也可以使用应用程序的上下文来启动新活动,但是您需要将intentIntent.FLAG_ACTIVITY_NEW_TASK
设置为intent以将其视为新任务 .现在提到你的案例:
LoginActivity.this
虽然它引用了你自己的类,它扩展了Activity类,但基类(Activity)也扩展了Context类,因此它可以用来提供活动上下文 .getApplication()
虽然它引用了Application对象但Application类扩展了Context类,所以它可以用来提供应用程序上下文 .getApplicationContext()
提供应用程序上下文 .getBaseContext()
提供活动背景 .Waqas的答案非常明确和完整,但是我想进一步澄清使用
this
与getBaseContext()
或getApplication()
与getApplicationContext()
之间的区别 .Activity
和Application
都不是Context
本身,而是ContextWrapper
,这是一个那个"real"上下文就是你用
getBaseContext()
得到的 .因此,尽管
this
(对于Activity
)和getBaseContext()
都给出了活动背景,(a)不要引用同一个对象(
this != getBaseContext()
)和(b)通过
this
调用上下文的效率稍差,因为调用会通过额外的间接级别 . 不过,我怀疑它是否有任何实际意义 .相同的逻辑适用于
getApplication()
与getApplicationContext()
.上面的行是一个活动,它是一个上下文 . 这是在你创建一些AlertDialogs时使用的......在某些地方它必须使用Activity Context ...
同样的make文本方法需要Context和Application本身实现
Context
这是最优选的方式,因为
Context
直到应用程序关闭 .此上下文可用于窗口小部件和视图 .
但是所有这些都给出了一个 Context 对象而没有别的......
Class.this如果你的类扩展了Activity getapplication()使用了引用应用程序和应用程序扩展应用程序上下文getbasecontext()引用你的活动上下文上下文引用你的活动生命周期上下文applicationcontext引用你的应用程序生命周期