Android 我真的需要将上下文实例深入到应用程序中吗?

Android 我真的需要将上下文实例深入到应用程序中吗?,android,architecture,android-activity,android-context,Android,Architecture,Android Activity,Android Context,在应用程序的某个地方,我需要使用getString方法获取一个本地化字符串,以获取错误消息。为此,我需要一个上下文实例,例如从一个活动中获取。这真的是这样设计的吗?我是真的被迫将这些对象传递到类和方法中,还是我没有抓住要点,是否有其他方法来获取字符串引用 为了澄清,在一个活动中,我有一个内部AsyncTask子类,它在doInBackground中实例化了一个新类,用于UI线程之外的一些短网络处理。我希望将错误消息本地化,为此,我需要将上下文实例(换句话说,活动)传递到该类中。从XML文件中获取

在应用程序的某个地方,我需要使用getString方法获取一个本地化字符串,以获取错误消息。为此,我需要一个上下文实例,例如从一个活动中获取。这真的是这样设计的吗?我是真的被迫将这些对象传递到类和方法中,还是我没有抓住要点,是否有其他方法来获取字符串引用


为了澄清,在一个活动中,我有一个内部AsyncTask子类,它在doInBackground中实例化了一个新类,用于UI线程之外的一些短网络处理。我希望将错误消息本地化,为此,我需要将上下文实例(换句话说,活动)传递到该类中。从XML文件中获取有价值资源的设计似乎有点不直观。这让我想知道,为什么它与上下文实例如此紧密地结合在一起,而不是静态的东西,或者——请原谅——一个单一的东西,因为上下文意味着它是全局应用程序上下文,而不是像活动一样只是它的一部分。

不,你不应该这样做。一个简单的规则是;如果您所需要的上下文涉及UI或仅与activity类的内部关联,那么您应该使用activity上下文。即使如此,重要的是,对上下文的任何引用的生存期都不能大于活动的生存期

不遵循这一点的最大危险是,您将对活动上下文的引用传递到代码中更深层的某个地方,并且在您持有的引用仍在范围内时,您的活动将被销毁。你刚刚泄露了你的活动和它所涉及的一切。我建议不要将活动上下文传递到活动之外,除非是真正必要的,即使如此,也要确保控制生命时间

因此,对于与UI无关的内容,需要上下文,例如需要获取字符串资源,然后使用应用程序上下文。在活动内部,如果字符串引用是在活动中声明的,那么使用活动上下文是可以接受的,并且在我看来,更可取,因为您正在有意识地决定范围和生命周期

也就是说,您应该询问是否将此特定方法更好地放在活动中。也许不是,但一定要问问你自己


最后,有一点迂腐。您不会在任何地方传递对象。传递一个引用,实际上是对象引用的值。Java中的所有内容都是按值传递的。

您可以随时扩展应用程序类。在上面创建一个静态方法,以便getInstance()获取上下文。

这是在实用程序类中发生的还是其他什么?您确实需要
getString()
的上下文,因此简短的回答是肯定的。如果您提供更多关于需要在何处/如何调用此函数的详细信息,那么可能有一种比传递/持有方法参数更好的方法。我不需要UI相关任务的上下文对象,只需要getString,因此通过类似状态类的方式使应用程序可用似乎是一种可行的方法。所有对全局可用状态(即单例)的憎恨都指向了我一个更丑陋的方向——传递引用。是的,我知道在Java中,你会将引用的副本传递给对象,而不是深度复制它们。顺便说一句,你的应用程序是一个单例,所以仇恨者可以憎恨他们喜欢的一切,但他们所做的一切都取决于单例:)是的,有很多方法可以滥用它,但使用应用程序上下文不是其中之一,因为它是单例,所以状态不在其中。您的应用程序实例是state。