58

有人可以向我解释一下吗:

Intent intent = new Intent(Context, AlarmReceiver.class);

我从不理解,我认真地认为,如果有人不尝试向我深入解释这一点,我永远不会理解。这整个上下文的事情让我很困惑。有时它是这样工作的:

Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);

有时它不会那样工作,但它只接受:

    Intent intent = new Intent(context, AlarmReceiver.class);

有时它:

Intent intent = new Intent(this, AlarmReceiver.class);

等等等等等等等等。

我了解上下文的基础知识,但有多少?为什么日食会一次又一次地给我一个错误?为什么有时我们需要声明上下文?:

Context context;

我无法为所有情况找到正确的上下文我如何知道在每种情况下什么是正确的?

4

3 回答 3

67

首先,我解释一下上下文更好一点,然后我们继续讨论如何使用和接收它。本质上,上下文是将资源链接到程序的参考。每个对象都有自己的上下文,其中包含设置该对象所需的资源。除了其他目的之外,还需要创建许多对象并获取程序标识信息。这使得设置新视图和活动非常宝贵,但它也可以用于其他目的。另请参阅此答案以获取更多信息。

一个项目的上下文可以来自不同的地方。有时它被存储并且必须被检索,有时它是继承的。基本上,这是面向对象的编程。

只是给你几个例子:

活动继承上下文。因此,如果你在一个活动中,你只需要传递它自己来使用上下文。它还包含一个指向getBaseContext(). 如果您需要整个应用程序上下文,您可能偶尔需要参考它,但很可能暂时不需要。

视图不继承上下文。但是,它确实有一个方法getContext()。如果您需要从视图中获取上下文,这就是获取它的方法。这个上下文不会是完整的,只会有视图内容的上下文。

片段也不继承上下文。它们包含一个方法getActivity(),如果 Fragment 处于活动状态,则该方法将返回活动,即 Fragment 的上下文。

BroadcastReceivers也不继承上下文。实际上,它们根本不包含上下文,只是在接收到事件时接收当前上下文(如onReceive(Context context, Intent intent)

于 2013-02-02T04:07:32.010 回答
11

上下文能力

您可以对给定的 Context 对象安全地采取的常见操作取决于它最初的来源。下表列出了应用程序将接收 Context 的常见位置,以及在每种情况下它的用途:

在此处输入图像描述

  1. 应用程序可以从这里启动一个 Activity,但它需要创建一个新任务。这可能适合特定的用例,但可能会在您的应用程序中创建非标准的回栈行为,通常不推荐或不被认为是好的做法。
  2. 这是合法的,但膨胀将使用您正在运行的系统的默认主题完成,而不是您的应用程序中定义的主题。
  3. 如果接收者为 null 则允许,用于获取粘性广播的当前值,在 Android 4.2 及更高版本上。

原创文章在这里

于 2016-08-04T17:51:41.203 回答
5

我通过上下文理解的是环境。简单来说,上下文是任何事物的环境。所以当你使用任何形式的上下文时,你必须决定你正在使用上下文的事物的周围环境。

例如,如果您希望某些数据或字段在整个应用程序中保留,您应该在应用程序类中定义它。

现在,当您在应用程序的任何组件中获取应用程序上下文时,您在应用程序类中声明的此字段将在您的上下文中。因此您可以访问它。

对于所有上下文类型也是如此。

如果您曾经尝试通过使用上下文“this”在服务组件中使用 alertDialog。试试这个,我敢打赌,您肯定会得到异常,因为“this”表示在其中使用时的服务环境。因为它是后台组件,我们可以t 在其中添加窗口。因此它会告诉您错误的令牌异常。这意味着为周围视图生成的令牌不适合 alertDialog 显示。

希望这能让您简要了解您想要什么。

于 2013-02-02T08:07:15.943 回答