差异和何时使用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);
吐司和意图 ,都需要参考上下文 。 而getApplication , getApplicationContext , LoginActivity.this和getBaseContext ,它们都提供对上下文的引用。
现在混淆的是不同情境的声明和具体用法。 为了简单起见,您应该在Android框架中计算两种types的上下文。
- 应用上下文
- 活动上下文
应用程序上下文被附加到应用程序的生命周期,并在应用程序的整个生命周期中始终保持相同。 所以,如果你使用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引用您的应用程序生命周期