为什么Android使用多个上下文,且每个上下文都不同?

7
我知道在Android中有许多上下文,例如:
  1. 应用程序(Application)
  2. 活动(Activity)
  3. 服务(Service)
  4. 内容提供者(ContentProvider)
  5. 广播接收器(BroadcastReceiver)
因此,当我创建一个new TextView时,我必须像这样在构造函数中传递context
TextView textView = new TextView(this);

我知道需要,但为什么不直接创建并让 Android 为我处理上下文呢?

3个回答

3
我喜欢从视觉上考虑“上下文”,因为我是一个狂热的Fragments用户,所以大多数时候我传递一个context,或者继承一个context实例,通常会来自一个Activity。如Android Developers所述,“它允许访问应用程序特定的资源和类,以及应用程序级别操作的上调,例如启动活动、广播和接收意图等”。基本上它可以帮助你执行“应用程序级别操作的上调”,所以让我们详细了解一下你的情况。
引用:“我知道它是必需的,但为什么不只是创建并让Android为我处理上下文?”
您创建的没有Context实例的TextView新实例。因此,它看起来像TextView tv = new TextView();将会让Android困惑,不知道该TextView是在应用程序级别还是活动级别生成的。在创建实例之前,TextView需要什么特征?当您转到TextView的构造函数时,您会注意到它需要一些重要信息才能生成所述TextView的新实例。例如:final Resources.Theme theme = context.getTheme();只是其中一行,他们通过Context实例收集信息,现在他们知道信息来自哪里,然后可以应用相应的主题。
除非您告诉Android从何处调用该类以及希望应用哪个主题,否则Android怎么知道呢?
最后回答您的问题:“为什么不让Android为我处理上下文?”这就是Android为您处理的,但它需要知道您来自哪里以及在生命周期的哪个阶段。
为什么不在应用程序上下文中初始化该主题并在TextView的代码中使用,而不需要我的干预?
因为这又归结于您想要基于哪个部件。假设我想在我的活动中放置一个TextView,但是我们调用了应用程序级别的上下文,则自动应用的主题将是@style/apptheme。但是,如果我希望该TextView遵循当前活动的相同样式指南,而不是手动更改每个要创建的小部件的主题(即开发人员),则Android会为您处理,无论您在应用程序中处于何位置。这使得样式更简单,创建新的TextView实例等都变得简单。
你知道,我还记得.NET平台的一个场景,当我在表单上创建新按钮并且没有传递任何参数给构造函数时,它会自动继承其父表单的主题。你认为.NET的设计在这方面更好吗?
很遗憾我没有使用.NET的经验,但是我认为关于应用程序在任何时候都可能被关闭和打开的情况下,活动、服务和接收器状态不断变化的问题。能够确保Android知道你所在的位置和你正在创建的内容是一个不错的功能。

真的太棒了@bradley-wilson,但有一件小事请教:您说上下文很重要,以便让TextView获得其主题,例如...好的,那为什么不在应用程序上下文中初始化该主题,并在TextView的代码中使用,而不需要我的干预呢? - Macnux
1
因为这又归结于您想要的小部件所在的位置。假设我想在我的活动中放置一个TextView,但我们正在调用应用程序级别的上下文,则自动应用的主题将是@style/apptheme。但是,如果我希望该TextView遵循当前活动的相同样式指南,而不是手动更改每个要创建的小部件的主题(即开发人员),则Android会为您处理,无论您在应用程序中的位置如何。它使样式更简单,创建TextView的新实例也更简单等等。 - Bradley Wilson
你知道吗,我记得在.NET平台上有这样一个场景,当我在表单上创建一个新按钮时,如果没有传递任何参数给构造函数,它会自动继承父表单的主题风格.. 你认为.NET的设计在这方面更好还是怎么样? - Macnux
1
很遗憾,我没有使用.NET的经验,但是我认为,针对应用程序在任何时候关闭和打开时活动、服务和接收器不断变化的状态,能够确保Android知道你所在的位置以及你正在创建什么是一个不错的功能。 - Bradley Wilson

1
我认为这一切都与“Context”的生命周期有关。例如,一个Activity可能会被终止和垃圾回收,这将使其Context为空。反过来也可以这样做。在某些情况下,引用Activity的上下文可能会导致内存泄漏,并且Activity永远不会被垃圾回收。
此外,请查看this answer

0

Context 是内存管理的方式。它可能是 Android 应用程序中使用最多的元素... 也可能是最被误用的。

您可以安全地对给定 Context 对象执行的常见操作取决于它最初来自哪里。

下面是一个表格,列出了应用程序将接收 Context 的常见位置以及每种情况的用法: 阅读此内容,希望对您有所帮助 https://possiblemobile.com/2013/06/context/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接