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

Mac*_*nux 6 android android-context

我知道android中有很多上下文

  1. 应用
  2. 活动
  3. 服务
  4. 内容提供商
  5. 广播接收器

所以当我创建一个new TextView我必须context像这样传递构造函数

TextView textView = new TextView(this);
Run Code Online (Sandbox Code Playgroud)

我知道它是必要的,但为什么不只是创建和Android为我处理上下文?

Bra*_*son 3

我喜欢从视觉上思考context,因为我是一个狂热的用户,Fragments所以大多数时候我传递一个实例context,或者继承一个context实例,它通常来自一个Activity

有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及对应用程序级操作的调用,例如启动活动、广播和接收意图等。

Android 开发人员中所述。它基本上为您提供了帮助,确保您可以执行“应用程序级操作的向上调用”,因此让我们在您的案例中详细说明这一点。

我知道这是必要的,但为什么不直接创建并让 android 为我处理上下文呢?

TextView在没有实例的情况下创建时的新实例Context。所以它看起来TextView tv = new TextView();会让 Android 混淆它的TextView生成位置。他们如何知道这是应用程序级别还是活动级别?TextView创建实例之前需要什么特征?当您转到 的TextView构造函数时,您会注意到它在生成 said 的新实例之前需要一些重要信息TextView。例如:final Resources.Theme theme = context.getTheme();只是他们通过实例收集信息的一行Context,现在他们知道信息来自哪里,然后他们可以应用相应的主题。

除非您告诉他们,否则 Android 如何知道您从何处调用该类以及您希望将什么主题应用于该类?

最后回答你的问题,“为什么不直接创建 android 来为我处理上下文呢?” android 为你处理事情,但它需要知道你来自哪里以及你处于生命周期的哪个阶段。

编辑:从评论中添加。

为什么不在应用程序上下文中初始化该主题并在文本视图的代码中使用而无需我的干扰

因为它再次归结为您希望该小部件基于的位置。假设我想要TextViewmy 的内部activity,但我们正在调用应用程序级别上下文,将自动应用的主题是@style/apptheme. 但是,如果我希望它TextView遵循当前相同的样式指南activity,而不是手动更改我想要创建的每个小部件(我是开发人员)的主题,则无论您在应用程序中的哪个位置,android都会为您处理它。它使样式更简单,创建简单的新实例TextView等等

你知道我记得 .NET 平台上的一个场景,当我在表单上创建新按钮时,没有任何东西传递给构造函数,它会自动继承父表单的主题..你认为 .NET 设计在这方面更好还是什么?

不幸的是,我没有使用 .NET 的经验,但我认为在使用可以随时关闭和打开的应用程序期间,活动、服务和接收器的状态不断变化。这是一个很好的功能,能够确保 Android 知道您在哪里以及您正在创建什么。