getContext(), getApplicationContext(), getBaseContext()和"this"

getContext()getApplicationContext()getBaseContext()this之间有什么区别?

虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能,请举一些简单的例子。

333267 次浏览
  • View.getContext():返回当前视图所在的上下文。通常是当前激活的活动。

  • Activity.getApplicationContext():返回整个应用程序的上下文(所有活动都在其中运行的进程) 的)。如果需要,请使用此上下文而不是当前的Activity上下文 上下文与整个应用程序的生命周期相关联,而不仅仅是 李当前活动。< / p > < / > 如果你需要从另一个上下文中访问一个Context,你可以使用ContextWrapper。的 从ContextWrapper内部引用的Context是通过 getBaseContext()。< / p > < /李>

Context为新创建的组件提供关于ActvityApplication的信息。

相关的Context应该提供给新创建的组件(无论是应用程序上下文还是活动上下文)

因为ActivityContext的子类,所以可以使用this来获取该活动的上下文

返回应用程序中运行的所有活动的上下文。

getBaseContext () -如果你想从应用程序中的另一个上下文访问上下文,你可以访问。

只返回当前正在运行的活动的上下文视图。

从这个文档

我明白你应该用:

尝试使用上下文应用程序而不是上下文活动

大多数答案已经涵盖了getContext()getApplicationContext(),但getBaseContext ()很少被解释。

方法getBaseContext()只在你有ContextWrapper时才相关。 Android提供了一个围绕现有的Context创建的ContextWrapper类,使用:

ContextWrapper wrapper = new ContextWrapper(context);

使用ContextWrapper的好处是它允许你“在不改变原始上下文的情况下修改行为”。例如,如果你有一个名为myActivity的活动,那么可以创建一个与myActivity不同主题的View:

ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);

ContextWrapper非常强大,因为它可以覆盖Context提供的大部分功能,包括访问资源的代码(例如openFileInput()getString()),与其他组件交互的代码(例如sendBroadcast()registerReceiver()),请求权限(例如checkCallingOrSelfPermission())和解析文件系统位置(例如getFilesDir())。ContextWrapper对于解决特定于设备/版本的问题或对需要上下文的视图等组件应用一次性自定义非常有用。

方法getBaseContext ()可以用来访问ContextWrapper所环绕的“基本”上下文。你可能需要访问“base”上下文,例如,检查它是否为ServiceActivityApplication:

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");
}
...
}
}

或者如果你需要调用一个方法的“unwrapped”版本:

class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}

语境是什么?是Android世界中最难的问题之一。

上下文定义了访问系统资源、检索应用程序的静态资产、检查权限、执行UI操作等等的方法。本质上,Context是生产环境中上帝对象反模式的一个例子。

当谈到我们应该使用哪种Context时,它变得非常复杂,因为除了是上帝对象之外,Context子类的层次树粗暴地违反了利斯科夫替换原则。

这篇博文(现在来自Wayback Machine)试图总结Context类在不同情况下的适用性。

为了完整起见,让我从那篇文章中复制主表:

+----------------------------+-------------+----------+---------+-----------------+-------------------+
|                            | 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               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. 应用程序可以从这里启动一个Activity,但它需要创建一个新任务。这可能适合特定的用例,但会在应用程序中创建非标准的反向堆栈行为,通常不推荐或不认为这是一个好的实践。
  2. 这是合法的,但是膨胀将使用您正在运行的系统的默认主题来完成,而不是应用程序中定义的主题。
  3. 在android4.2及以上版本中,如果接收端为空则允许,用于获取粘滞广播的当前值。

截图

# EYZ0

它用于应用程序级别,并引用所有活动。

# EYZ0

很可能是相同的。这些只是指当前活动是活的。

总是引用当前类对象。

Context是:

  • 一个抽象类,它的实现由Android系统提供。
  • 它允许访问特定于应用程序的资源和类 对应用程序级操作的向上调用,例如启动活动, 广播和接收意图等

这个:当前类对象

getContext():返回当前活动的上下文

getApplicationContext():返回应用程序中正在运行的所有活动

返回应用程序中运行的所有活动的上下文。

getBaseContext () -当你想从应用程序中的另一个上下文访问上下文时,你可以访问。

只返回当前正在运行的活动的上下文视图。

-它引用当前类对象

它引用当前活动类对象,而活动继承上下文,因此必须在可以使用上下文或活动的地方使用它。