getContext() , getApplicationContext() , getBaseContext() 和 “this” 之间的区别

Difference between getContext() , getApplicationContext() , getBaseContext() and "this"

提问人:iCurious 提问时间:5/18/2012 最后编辑:N JiCurious 更新时间:1/10/2023 访问量:344105

问:

、、和“”有什么区别?getContext()getApplicationContext()getBaseContext()this

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

这个 android-context

评论

1赞 ky1enamic 5/18/2012
第一个答案中有一个很好的写法:stackoverflow.com/questions/1026973/......
0赞 Just The Highlights 8/29/2017
可能的重复项 获取上下文的各种方法之间有什么区别?

答:

603赞 Alexander Lucas 5/18/2012 #1
  • View.getContext():返回当前运行视图的上下文。通常是当前处于活动状态的活动。

  • Activity.getApplicationContext():返回整个应用程序的上下文(所有 Activity 都在其中运行的进程) 的)。如果需要,请使用它而不是当前 Activity 上下文 上下文与整个应用程序的生命周期相关联,而不仅仅是 当前活动。

  • ContextWrapper.getBaseContext():如果您需要从另一个上下文中访问上下文,请使用 ContextWrapper。这 从 ContextWrapper 内部引用的上下文通过 getBaseContext() 中。

评论

18赞 Mikey 11/9/2012
+CooL i3oY 与 getContext 相同
16赞 Ravi 1/16/2013
实际上我很困惑,上下文的正确定义是什么??
12赞 KCRaju 8/24/2013
“this” 和 getContext() 是相同的
52赞 nandan 5/7/2015
this并且并不总是相同的,例如在 Activity 类中,您可以使用,因为继承自 但方法不在类中。 @mikedroid @KCRajugetContext()thisActivityContextgetContext()Activity
6赞 LarsH 7/3/2015
this给出它所在的类的实例,该类可以是任何类,不一定是上下文。如果在 Activity 类中使用它,则将是 .thisContext
28赞 tez 3/2/2013 #2

Context提供有关新创建的组件的 OR 的信息。ActvityApplication

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

由于是 的子类,因此可以使用它来获取该活动的上下文ActivityContextthis

40赞 Jaykumar Patel 3/10/2014 #3

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

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

getContext() - 仅返回当前正在运行的上下文视图活动。

1赞 mehmet 4/15/2014 #4

从这个文档

我知道你应该使用:

尝试使用 context-application 而不是 context-activity

150赞 Mike Laren 2/14/2017 #5

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

该方法仅在您具有 . Android 提供了一个类,该类是围绕现有创建的,使用:getBaseContext()ContextWrapperContextWrapperContext

ContextWrapper wrapper = new ContextWrapper(context);

使用 a 的好处是,它可以让你“在不改变原始上下文的情况下修改行为”。例如,如果您调用了一个名为 Activity,则可以创建与以下主题不同的 :ContextWrappermyActivityViewmyActivity

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

ContextWrapper非常强大,因为它允许您覆盖通过包含代码来访问资源(例如,)、与其他组件交互(例如、)、请求权限(例如)和解析文件系统位置(例如)提供的大多数功能。 对于解决特定于设备/版本的问题或将一次性自定义应用于需要上下文的组件(如视图)非常有用。ContextopenFileInput()getString()sendBroadcast()registerReceiver()checkCallingOrSelfPermission()getFilesDir()ContextWrapper

getBaseContext() 方法可用于访问包装的“基本”上下文。您可能需要访问“基本”上下文,例如,检查它是否是 或 :ContextWrapperServiceActivityApplication

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();
    }
  }
}

评论

24赞 0leg 3/31/2017
我想说,这是在接受之后最重要的答案。
8赞 Vasiliy 11/24/2017
我想说的是,Android框架开发人员做出的最糟糕的决定之一。当他们意识到他们创建了一整套上帝对象时,他们没有做正确的事情并将代码重构为单一责任,而是添加了一个丑陋的黑客,允许通过深化继承树来改变上下文行为。糟糕的软件工程是最丑陋的。至于我们,开发人员,恕我直言,任何人都不应该使用或.如果你这样做了 - 这是一个巨大的“代码气味”。ContextWrappergetBaseContext()ContextWrapper
0赞 Alston 9/29/2019
我想看看完整的代码。谢谢:)))CustomToast
1赞 Bawender Yandra 7/3/2020
谢谢你的回答,我不知道 ContextWrapper 要这样使用!!我一直认为这是 Android 团队内部的东西。在我看来,这是预期的答案。T H A N K S !!
47赞 Vasiliy 3/10/2017 #6

“什么是上下文”这个问题是 Android 世界中最困难的问题之一。

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

当谈到我们应该使用哪种时,它变得非常复杂,因为除了作为上帝对象之外,子类的层次结构树残酷地违反了李斯科夫替换原则。ContextContext

这篇博文(现在来自 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. 应用程序可以从此处启动活动,但需要创建新任务。这可能适合特定的用例,但可能会在应用程序中创建非标准的后退堆栈行为,通常不建议或被视为良好做法。
  2. 这是合法的,但通货膨胀将使用您运行的系统的默认主题来完成,而不是应用程序中定义的主题。
  3. 如果接收器为 null(用于获取粘滞广播的当前值),则在 Android 4.2 及更高版本上允许。

screenshot

3赞 Jatin Bansal 8/11/2017 #7

getApplicationContext()

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

getContext() 和 getBaseContext()

很可能是相同的,这些仅引用实时的当前活动。

始终引用当前类对象。

1赞 SANKET RAMANI 11/7/2019 #8

A 是:Context

  • 一个抽象类,其实现由 Android 系统提供。
  • 它允许访问特定于应用程序的资源和类,以及 对应用程序级操作(如启动活动)的向上调用, 广播和接收意图等。
2赞 Abolee 3/24/2021 #9

this: 当前类对象

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

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

2赞 Shirsh Shukla 2/12/2022 #10

getApplicationContext() - 它返回应用程序中运行的所有活动的上下文。

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

getContext() - 它只返回上下文视图当前正在运行的活动。

this - 它指的是当前的类对象

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