Android意图上下文令人困惑

时间:2013-02-02 04:05:03

标签: java android android-intent android-context

有人可以向我解释一下:

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

等。等许多其他。

我理解上下文的基础但有多少?为什么eclipse会一次又一次地给我一个错误呢?为什么我们有时需要声明上下文? :

Context context;

我无法为所有情况找到合适的背景,我怎么知道在任何情况下什么是正确的?

3 个答案:

答案 0 :(得分:61)

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

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

只是举几个例子:

Activity继承了上下文。因此,如果您在活动中,则只需要传递自己以使用上下文。它还包含指向getBaseContext()的指针。如果您需要整个应用程序上下文,可能偶尔需要引用它,但很可能您暂时不会。

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

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

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

答案 1 :(得分:8)

上下文功能

您可以安全地使用给定的Context对象执行的常见操作取决于它最初的来源。下面是一个应用程序将接收Context的常见位置表,并且在每种情况下它对它有用:

enter image description here

  1. 应用程序可以从此处启动活动,但需要创建新任务。这可能适合特定的用例,但可以在您的应用程序中创建非标准的堆栈行为,通常不建议或被视为良好实践。
  2. 这是合法的,但通货膨胀将使用您运行的系统的默认主题,而不是您的应用程序中定义的内容。
  3. 如果接收方为空,则允许在Android 4.2及更高版本上用于获取粘性广播的当前值。
  4. 原创文章here

答案 2 :(得分:5)

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

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

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

所有上下文类型都是如此。

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

希望这能让你简单了解自己想要什么。

相关问题