Android Intent Context Confusing

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

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;

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


答案 1

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

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

举几个例子:

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

视图不继承上下文。但是,它确实有一个方法getContext()。。如果您需要从视图中获取上下文,则可以使用此方法获取上下文。此上下文将不完整,而将仅具有视图内容的上下文。

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

广播接收者也不会继承上下文。实际上,它们根本不包含上下文,而只是在接收事件时接收当前上下文(例如 onReceive(上下文上下文,意图意图))


答案 2

上下文功能

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

enter image description here

  1. 应用程序可以从此处启动活动,但它需要创建新任务。这可能适合特定的用例,但可能会在应用程序中创建非标准的后退堆栈行为,通常不建议这样做,也不认为这是好的做法。
  2. 这是合法的,但通货膨胀将使用运行该系统的默认主题来完成,而不是应用程序中定义的主题。
  3. 如果接收器为空值(用于获取粘性广播的当前值),则在 Android 4.2 及更高版本上允许这样做。

原始文章在这里


推荐