Android getContext()、getApplicationContext()、getBaseContext()和;这";
Android getContext()、getApplicationContext()、getBaseContext()和;这";,android,this,android-context,Android,This,Android Context,getContext(),getApplicationContext(),getBaseContext(),和“this”之间有什么区别 虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能,请给出一些简单的例子。 :返回视图当前运行的上下文。通常是当前活跃的活动 :返回整个应用程序(所有活动都在其中运行的进程)的上下文 的)。如果需要,请使用此上下文而不是当前活动上下文 上下文绑定到整个应用程序的生命周期,而不仅仅是 目前的活动 :如果需要从另一个上下文中访问上下文,请使用Cont
getContext()
,getApplicationContext()
,getBaseContext()
,和“this
”之间有什么区别
虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能,请给出一些简单的例子。- :返回视图当前运行的上下文。通常是当前活跃的活动
- :返回整个应用程序(所有活动都在其中运行的进程)的上下文 的)。如果需要,请使用此上下文而不是当前活动上下文 上下文绑定到整个应用程序的生命周期,而不仅仅是 目前的活动
- :如果需要从另一个上下文中访问上下文,请使用ContextWrapper。这个 通过访问ContextWrapper内部引用的上下文 getBaseContext()
上下文
向新创建的组件提供有关活动
或应用程序
的信息
应向新创建的组件(无论是应用程序上下文还是活动上下文)提供相关的上下文
由于Activity
是Context
的子类,因此可以使用this
获取该活动的上下文
getApplicationContext()-返回应用程序中运行的所有活动的上下文
getBaseContext()-如果要从应用程序中的另一个上下文访问上下文,可以访问
getContext()-仅返回当前正在运行的活动的上下文视图
由此
我理解您应该使用:
尝试使用上下文应用程序而不是上下文活动
大多数答案已经涵盖了getContext()
和getApplicationContext()
但是getBaseContext()很少被解释
方法getBaseContext()
仅当您有ContextWrapper
时才相关。
Android提供了一个ContextWrapper
类,该类是围绕现有上下文创建的,使用:
ContextWrapper wrapper = new ContextWrapper(context);
使用ContextWrapper
的好处是,它允许您“在不更改原始上下文的情况下修改行为”。例如,如果您有一个名为myActivity
的活动,则可以创建一个主题不同于myActivity
的视图
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
非常强大,因为它允许您覆盖Context
提供的大多数函数,包括访问资源的代码(例如openFileInput()
,getString()
),与其他组件交互(例如sendBroadcast()
,registerReceiver()
),请求权限(例如,checkCallingOrSelfPermission()
)和解析文件系统位置(例如,getfiledir()
)。ContextWrapper
对于解决设备/版本特定的问题或对需要上下文的视图等组件应用一次性定制非常有用
方法getBaseContext()可用于访问ContextWrapper
环绕的“基本”上下文。如果需要,您可能需要访问“基本”上下文,例如,检查它是否是服务
、活动
或应用程序
:
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
或者,如果需要调用方法的“展开”版本:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}
“上下文是什么”是Android世界中最困难的问题之一
上下文定义了访问系统资源、检索应用程序静态资产、检查权限、执行UI操作等方法。本质上,Context
是生产中的God对象反模式的一个示例
当谈到我们应该使用哪种类型的上下文时,它变得非常复杂,因为上下文子类的层次结构树除了作为上帝对象外,还粗暴地违反了Liskov替换原则
(现在来自Wayback Machine)尝试总结上下文
类在不同情况下的适用性
为了完整起见,让我从那篇文章中复制主表:
应用程序可以从此处启动活动,但它需要创建新任务。这可能适合特定的用例,但可能会在应用程序中创建非标准的后堆栈行为,通常不推荐或视为良好做法
这是合法的,但将使用运行系统的默认主题,而不是应用程序中定义的主题
在Android 4.2及更高版本上,如果接收器为空(用于获取粘性广播的当前值),则允许此选项
获取应用程序上下文()
这用于应用程序级别,并指所有活动
getContext()和getBaseContext()
很可能是相同的。这些是仅引用当前活动的活动
这个
始终引用当前类对象
上下文是:
- 一个抽象类,其实现由Android系统提供
- 它允许访问特定于应用程序的资源和类,以及
向上调用应用程序级操作,如启动活动,
广播和接收意图等
此:当前类对象
getContext():返回当前活动的上下文
getApplicationContext():返回应用程序中运行的所有活动第一个答案中有一个很好的书写:可能与GetContext相同的+CooL i3oY重复。实际上,我不知道上下文的正确定义是什么??“this”和getCont
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| | Application | Activity | Service | ContentProvider | BroadcastReceiver |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| Show a Dialog | NO | YES | NO | NO | NO |
| Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ |
| Layout Inflation | NO² | YES | NO² | NO² | NO² |
| Start a Service | YES | YES | YES | YES | YES |
| Bind to a Service | YES | YES | YES | YES | NO |
| Send a Broadcast | YES | YES | YES | YES | YES |
| Register BroadcastReceiver | YES | YES | YES | YES | NO³ |
| Load Resource Values | YES | YES | YES | YES | YES |
+----------------------------+-------------+----------+---------+-----------------+-------------------+