【问题标题】:Application context gets killed but activity not应用程序上下文被杀死但活动没有
【发布时间】:2012-05-18 18:11:14
【问题描述】:

我正在开发一个包含一些活动的应用程序。一个活动开始下一个活动。为了分享一些价值,我使用了一个名为 MyApplication 的自定义应用程序实现(我说的是 android.app.Application)。
众所周知,Android 系统会在应用程序需要更多空间时将其杀死。但这会导致一个问题:

  • 我打开我的应用程序并像使用任何其他应用程序一样使用它
  • 我关闭它(主页按钮)并使用其他应用程序
  • 系统将杀死我的应用程序,因为它正在浪费内存
  • 当我重新打开我的应用程序时,它想打开我使用的最后一个活动并且我强制关闭,因为 MyApplication 中的值为 null

奇怪的是,系统破坏了我的应用程序,但它似乎保留了 Activity。我真的不明白为什么会这样,因为应用程序似乎没有生命周期。

我想拥有的:
当 MyApplication(整个应用程序,不仅仅是活动)被杀死时,我希望最后的活动也被杀死。因此,当我重新打开应用程序时,它会启动 manifest.xml 提供的主要活动。

MyApplication 中的值是持久存在的,并且在应用程序被破坏时不会丢失。 (我说的是一些对象,所以我认为共享首选项不起作用)。
我不想使用服务来绑定我的活动,但是有没有类似的方法告诉系统我上次使用的活动取决于应用程序上下文?

我希望你明白我的问题是什么,有人可以帮助我解决这个问题。

【问题讨论】:

  • 我喜欢所有答案似乎都没有提到您对自定义应用程序的使用,即使您清楚地注意到它的用途:/)。您是否尝试过使用 Application.ActivityLifecycleCallbacks,甚至不确定这是否是您想要完成的(似乎您可能需要反向directio)。
  • 我认为您指的是 Activity Stack History,仪式?
  • 感谢 MikeIsrael,你是对的。以下答案与我的问题无关。使用活动生命周期只是一种解决方法。如果整个应用程序被杀死,我希望应用程序可以处理它的活动并杀死它们。活动堆栈历史记录而不是处理后退按钮行为而不是我的问题。我真的很确定这是一个应用程序问题,而不是一个活动问题。
  • @joshplusa 你找到解决方案了吗?我现在遇到了完全相同的问题,因为我的 android.app.Application 包含大量“全局”数据,并且我发现有时在返回应用程序时活动堆栈仍然存在(例如,我返回到一个活动依赖于该全局数据),但 .application 扩展已被杀死。这很令人困惑,因为我的印象是 .application 实例会在任务的整个生命周期内持续存在。

标签: android application-lifecycle


【解决方案1】:

在您自定义的应用程序实现中,添加一个标志说:

public boolean appContextExist = false;

在您的第一个 Activity 上将标志设置为 true,

在需要上下文的 Activity 上覆盖 onCreate 和 onResume 方法,添加以下内容:

MyApplication myApp = ((MyApplication) getApplicationContext());
if (!myApp.appContextExist) {
    // Code to return to start activity here
}

【讨论】:

    【解决方案2】:

    您应该确保应用程序在 onPause()onResume()onStop() 方法中以您希望的方式关闭并重新启动。查看savedInstanceState,它可以保存应用程序的状态(并在它作为参数发送到onCreate时恢复它)

    【讨论】:

    • 谢谢,但我说的是应用程序而不是活动。
    • @joshplusa 您说的是两者,并且您希望在 onStops() 之后恢复时启动主要活动,对吗?
    • 是的。目前我正在 onResume() 中检查我的值。如果它们为空,我会完成应用程序。通过这样做,我将随时进入主要活动。但它有点脏。也许我必须仔细看看 Activity Stack History。感谢您的回复!
    【解决方案3】:

    正确的做法是保存您的应用程序状态。 重写 onSaveInstanceState(Bundle savedInstanceState) 方法以保存您的状态,并重写 onRestoreInstanceState 以检索它。

    如果您需要保存大量数据,请考虑使用 SQL 数据库

    【讨论】:

    • 感谢提示,但正如我在帖子中所写,这对我不起作用。据我了解,我无法将自己的对象保存在应用程序状态。
    • 那么我最好的猜测是使用 SQL 数据库来保存您的对象
    • 好的。我会仔细看看解决我的问题的最佳方法是什么。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多