为什么LayoutInflater需要上下文?

5

我想知道为什么实现者决定让开发人员传递上下文(尽管系统服务对于开发人员更像是单例,而且我们大多数时候并不关心):

LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(layout);

我提出这个问题主要是因为我隐含地担心每当我使用context时可能会泄漏内存/上下文。这里是否存在误操作上下文的可能性?

3个回答

6
在Android中,您的应用程序上下文类似于将其连接到系统服务的管道。许多系统服务是单例的,但您不能随意访问它们。Context类充当中间人,接收并传递您需要的服务。 LayoutInflater.from(context); 简单地调用 context.getSystemService() ,使用提供的上下文(即您的应用程序上下文)来获取所需的服务。
本质上,您的应用程序和Android是同时运行的两个不同的事物,而Context则作为一种管道将它们连接起来。

谢谢,但我正在思考的问题是,如果我错误地管理了这个“管道”(比如说我有一个带有Activity上下文的静态LayoutInflater)会导致内存泄漏吗?考虑到开发人员并不真正关心将他的应用程序与Android连接起来,使用ApplicationContext作为默认值(因此不需要推动开发人员传递任何参数)是否是一个好的选择?只是说一下! - dev
@Raj 你应该通过应用程序上下文来访问像LayoutInflater这样的东西,因为它存在于整个应用程序的生命周期中。使用Activity和Service的上下文是不可靠的,因为它们在Activity或服务结束时会被销毁。 - Raghav Sood

1
由于每个Android服务都需要上下文。LayoutInflater是Android服务。关于这点还有另一种声明;
 LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

1
根据安卓文档: Context: 应用程序环境的全局信息接口。这是一个抽象类,其实现由安卓系统提供。它允许访问应用程序特定的资源和类,以及应用程序级操作的上调,例如启动活动、广播和接收意图等。
因此,“context”保存不同的环境参数。这些参数非常依赖于应用程序和系统。
“为什么实现者决定让开发人员传递上下文”
当您创建任何活动或创建任何对话框或服务或其他任何内容时,Android需要几个不同的环境属性。因此,应该有一些东西可以提供所有这些信息,并且可以根据您的操作在内部执行不同的任务。在Android中,上下文可以做到这一点。
例如:如果您在Android中发送广播,则会在不同活动和应用程序中接收所有广播接收器。这些事情您不需要自己管理,但可以使用,一切都已经由Android管理,这就是我们大多数人甚至不关心的原因。

系统提供了上下文,因此我们不需要过多关注内存泄漏。如果您查看不同的公共参数(http://developer.android.com/reference/android/content/Context.html),则会发现大多数事情都可以设置或简单获取。功能也主要在应用程序层面而不是系统级别。因此,泄漏需要您为代码而不是上下文而注意。


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