【问题标题】:Extending Application扩展应用
【发布时间】:2011-04-16 08:02:04
【问题描述】:

我想在我的 Android 应用程序中扩展应用程序。我这样做是为了创建一个名为 MyApplication 的扩展应用程序对象并将其添加到清单中。

我现在想添加一些 getter 和 setter 来保存一些信息。看起来我需要将应用程序上下文传递给任何不包含上下文的类。

例如,假设我创建了一个名为 MyObject 的类(在它自己的 java 文件中):

public class MyObject {
  public void doStuff() {
    // do stuff
  }
}

如何从 doStuff() 访问 MyApplication?看起来我需要将应用程序上下文传递给 MyObject。这是典型的吗?有泄漏的可能吗?

另外,为了确保我清楚,MyApplication(以及其中的变量)是否会在应用程序的整个生命周期中存在?无论哪种方式都很好。我只是想确保在需要时考虑到这一点。

最后,任何指向某些示例源的链接,以显示扩展 Application 的不同用途,我们将不胜感激。

【问题讨论】:

    标签: android extend android-context


    【解决方案1】:

    据我所知,传递上下文在 Android 开发中并不少见。好吧,要么那个,要么我做错了。

    我不确定您是否需要回答这个问题,但从上下文中,您可以像这样访问Application 对象:

    ((MyApplication) context.getApplicationContext()).getMyGlobalVariable();
    

    是的,您的 MyApplication 类应该存在于整个应用程序生命周期中。

    还可以查看this answer

    【讨论】:

    • 感谢您的回复。我的大部分繁重工作都是在 IntentService(我可以访问应用程序的上下文)中完成的,对我的全局数据的大多数其他调用都来自于活动中;所以我想我会没事的。任何其他地方(比如在我的 OP 示例中),我都可以传递数据。
    • 我试图在一个不是活动的类中获取对 MyApplication 对象的引用,因此我无法使用典型的 (MyApplication)this.getApplication()。这就是您的建议有很大帮助的地方,我刚刚传递了上下文并获得了对 MyApplication 的引用,感谢 TON!
    【解决方案2】:

    只要传递正确的上下文,在 Android 中传递上下文就可以了。避免将活动作为上下文传递。请改用getApplicationContext()

    您的应用程序对象以及与之关联的所有数据将在您的应用程序的整个生命周期中持续存在。即使应用程序处于后台并且所有活动都从内存中清除,因为它们不再显示。应用程序对象何时从内存中清除的记录并没有很好的记录,但我认为如果您的应用程序在后台并且内存很少,则操作系统可能会破坏您的整个应用程序,因此也会从内存中删除应用程序对象。

    如果您无法访问上下文,则无法获取应用程序对象。如果您只需要对应用程序的引用,只需传递应用程序对象,这将最大限度地减少因保存对不再显示在屏幕上的活动的引用以及通过此引用泄漏整个活动而可能出现的错误。

    我没有任何示例代码,但我用它来保存对某些任务的引用。这使我能够允许用户非常快速地在 Activity 之间切换,而无需等待任务返回,即使下一个 Activity 必须根据当前正在运行的任务更改某些状态。

    【讨论】:

    • 只是关于传递 getApplicationContext() 的注释。不要用它来启动打开网页的意图——它会抛出异常。 :)
    猜你喜欢
    • 2016-07-17
    • 2011-08-06
    • 1970-01-01
    • 2011-06-23
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2022-01-17
    相关资源
    最近更新 更多