区别以及何时使用 getApplication()、getApplicationContext()、getBaseContext() 和 someClass.this
Posted
技术标签:
【中文标题】区别以及何时使用 getApplication()、getApplicationContext()、getBaseContext() 和 someClass.this【英文标题】:difference and when to use getApplication(), getApplicationContext(), getBaseContext() and someClass.this 【发布时间】:2012-05-07 23:57:26 【问题描述】:我是 android 新手,我正在尝试了解 getApplication()
、getApplicationContext(
)、getBaseContext()
、getContext()
和 someClass.this
之间的区别,尤其是在以下情况下何时使用这些方法代码行:
当我启动 toast 时,它们之间有什么区别?在什么情况下使用它们?
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);
【问题讨论】:
***.com/q/1026973/741249 或 ***.com/q/6854265/741249 的可能重复 他们只处理上下文和baseContext。但我想了解它们在 2 个上下文中的所有用法。谢谢 【参考方案1】:Toast 和 Intent,都需要引用 context。而 getApplication、getApplicationContext、LoginActivity.this 和 getBaseContext,它们都提供对上下文的引用。
现在令人困惑的是不同上下文的声明及其具体用法。为简单起见,您应该计算 Android 框架中可用的两种类型的上下文。
-
应用程序上下文
活动上下文
应用程序上下文附加到应用程序的生命周期,并且在应用程序的整个生命周期中始终保持不变。因此,如果您使用 Toast,您可以使用应用程序上下文甚至活动上下文(两者都使用),因为可以从应用程序中的任何位置引发 toast,并且不附加到窗口。
Activity 上下文附加到 Activity 的生命周期中,如果 Activity 的 onDestroy()
被引发,则可以将其销毁。如果你想启动一个新的activity,你必须在它的Intent中使用activity的上下文,以便新的启动activity连接到当前的activity(就activity栈而言)。但是,您也可以使用应用程序的上下文来启动新的活动,但是您需要设置标志 Intent.FLAG_ACTIVITY_NEW_TASK
以将其视为新任务。
现在参考你的案例:
LoginActivity.this
虽然指的是你自己的类,它扩展了Activity类,但基类(Activity)也扩展了Context类,所以它可以用来提供Activity上下文。
getApplication()
虽然是指Application对象,但是Application类扩展了Context类,所以可以用来提供应用上下文。
getApplicationContext()
提供应用程序上下文。
getBaseContext()
提供活动上下文。
提示:每当您需要操作
Views
时,请使用 Activity-Context,否则 Application-Context 就足够了。
【讨论】:
所以如果我做对了,someClass.this、getBaseContext 和 getContext() 是活动上下文,而 getApplicationContext() 和 getApplication() 是应用程序上下文? context 只是关于环境的信息,对吧? 是的,它就像托管应用程序的沙箱 @committedandroider 因为活动上下文包含所选主题的额外信息,所以当在代码中创建视图时,将自动应用正确的主题。欲了解更多信息,您可以阅读this @waqaslam 指 android sdk 类,Context
-> ContextWrapper
-> 1.Application
& 2.ContextThemeWrapper
-> Activity
;而getBaseContext()
是ContextWrapper
的方法,所以getBaseContext() offers activity context.
和Application Context
也是...不是吗?【参考方案2】:
Waqas 的答案非常清晰和完整,但是我想进一步澄清使用 this
与 getBaseContext()
或 getApplication()
与 getApplicationContext()
之间的区别。 Activity
和 Application
都不是 Context
本身扩展的,而是 ContextWrapper
,这是一个
“
Context
的代理实现,它只是将其所有调用委托给另一个Context
”。
使用getBaseContext()
可以获得“真实”上下文。
所以虽然this
(对于Activity
)和getBaseContext()
都给出了活动上下文,但它们
this != getBaseContext()
) 和
(b) 通过this
调用上下文的效率略低,因为调用要经过额外的间接级别。不过,我怀疑这有什么实际区别。
同样的逻辑适用于getApplication()
与getApplicationContext()
。
【讨论】:
就getBaseContext()
而言,Google 的 Android 开发人员建议:“不要使用 getBaseContext(),只需使用你拥有的 Context。”因此,实际上,他们建议您将 this
用于活动。
这是我在网上找到的对getBaseContext
最清晰的解释。谢谢!!【参考方案3】:
LoginActivity.this
上面的行是一个 Activity,它显然是一个 Context.. 这在您创建一些 AlertDialogs 时使用...在某些地方,您必须使用 Activity Context...
getApplication()
这里make text方法需要Context,Application本身实现Context
getApplicationContext()
这是最优选的方式,因为这个Context
一直存在到应用程序关闭。
getBaseContext()
此上下文可用于小部件和视图..
但他们都给出了一个 Context 对象,没有别的......
【讨论】:
所以在 toast 消息或创建意图时,即使使用 getApplicationContext() 是最正确的,它们都具有相同的效果? @Hassan Samii:对于 Toast,您可以在所有情况下使用getApplicationContext()
,但在 Activity 中制作 Toast 时最好使用 this
。【参考方案4】:
Class.this 如果您的类扩展了 Activity 则使用 getapplication() 用于引用应用程序和应用程序扩展应用程序上下文 getbasecontext() 引用您的活动上下文 上下文是指您的活动生命周期上下文 applicationcontext 指的是你的应用生命周期
【讨论】:
以上是关于区别以及何时使用 getApplication()、getApplicationContext()、getBaseContext() 和 someClass.this的主要内容,如果未能解决你的问题,请参考以下文章
Grunt、Gulp.js 和 Bower 有啥区别?为啥以及何时使用它们?
appbar、toolbar、actionbar 之间的确切区别是啥?以及何时专门使用它们?