我是 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);
Toast 和 Intent,两者都需要参考上下文。而 getApplication、getApplicationContext、LoginActivity.this 和 getBaseContext,它们都提供对上下文的引用。
现在令人困惑的是不同上下文的声明及其特定用法。为简单起见,您应该计算 Android 框架中可用的两种类型的上下文。
应用程序上下文活动上下文
应用程序上下文附加到应用程序的生命周期,并且在应用程序的整个生命周期中始终相同。因此,如果您使用 Toast,则可以使用应用程序上下文甚至活动上下文(两者),因为可以从应用程序中的任何位置引发 Toast,并且不附加到窗口。
Activity 上下文附加到 Activity 的生命周期,并且可以在 Activity 的 onDestroy()
被引发时销毁。如果你想启动一个新的活动,你必须在它的 Intent 中使用活动的上下文,以便新的启动活动连接到当前活动(在活动堆栈方面)。但是,您也可以使用应用程序的上下文来启动一个新活动,但是您需要设置标志 Intent.FLAG_ACTIVITY_NEW_TASK
以将其视为一个新任务。
现在参考您的案例:
LoginActivity.this
虽然它指的是您自己的类,它扩展了 Activity 类,但基类(Activity)也扩展了 Context 类,因此它可以用来提供 Activity 上下文。
getApplication()
虽然它是指 Application 对象,但 Application 类扩展了 Context 类,因此它可以用来提供应用程序上下文。
getApplicationContext()
提供应用程序上下文。
getBaseContext()
提供活动上下文。
提示:每当你需要操作视图时,就选择 Activity-Context,否则 Application-Context 就足够了。
Waqas 的回答非常清楚和完整,但是我想进一步澄清使用 this
与 getBaseContext()
或 getApplication()
与 getApplicationContext()
之间的区别。 Activity
和 Application
都不是扩展 Context
本身,而是扩展 ContextWrapper
,它是
“Context 的代理实现,它只是将其所有调用委托给另一个 Context”。
“真实”的上下文是您使用 getBaseContext()
得到的。
因此,尽管 this
(对于 Activity
)和 getBaseContext()
都给出了活动上下文,但它们
(a) 不要引用同一个对象 (this != getBaseContext()) 和
(b) 通过 this 调用上下文的效率略低,因为调用通过了额外的间接级别。不过,我怀疑它是否有任何实际区别。
相同的逻辑适用于 getApplication()
与 getApplicationContext()
。
getBaseContext()
而言,Google 的 Android 开发人员建议:“不要使用 getBaseContext(),只需使用你拥有的 Context。”因此,实际上,他们建议您将 this
用于活动。
getBaseContext
最清晰的解释。谢谢!!
LoginActivity.this
上面的行是一个 Activity,它明显是一个 Context .. 当您创建一些 AlertDialogs 时使用它...在某些地方,您必须使用 Activity Context ...
getApplication()
同样,make text 方法需要 Context 和 Application 本身实现 Context
getApplicationContext()
这是最首选的方式,因为此 Context
一直存在到应用程序关闭。
getBaseContext()
此上下文可用于小部件和视图..
但是它们都给出了一个 Context 对象,没有别的了。
getApplicationContext()
,但在 Activity 中制作 Toast 时最好使用 this
。
Class.this 如果您的类扩展 Activity 使用 getapplication() 使用参考应用程序和应用程序扩展应用程序上下文 getbasecontext() 参考您的活动上下文上下文参考您的活动生命周期上下文 applicationcontext 参考您的应用程序生命周期
不定期副业成功案例分享
Context
->ContextWrapper
-> 1.Application
& 2.ContextThemeWrapper
->Activity
;getBaseContext()
是ContextWrapper
的方法,所以getBaseContext() offers activity context.
和Application Context
也是...不是吗?