我喜欢从视觉上考虑“上下文”,因为我是一个狂热的
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知道你所在的位置和你正在创建的内容是一个不错的功能。