Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android任务生命周期和静态数据,任务是否曾被销毁?_Java_Android_Android Activity_Android Lifecycle - Fatal编程技术网

Java Android任务生命周期和静态数据,任务是否曾被销毁?

Java Android任务生命周期和静态数据,任务是否曾被销毁?,java,android,android-activity,android-lifecycle,Java,Android,Android Activity,Android Lifecycle,Android活动有一个定义良好的生命周期,它们将被暂停、停止和销毁。这是非常有记录的。我的问题是关于包含我的活动的任务 在内存不足或其他情况下,任务是否会被操作系统关闭?(我理解用户可以强制停止应用程序) 我可以假设我的单例数据和静态数据总是可用的吗 活动上定义的静态成员如何?看起来活动可能会被销毁,但静态数据的寿命与任务的寿命一样长 android.app.Application有onLowMemory()和ontrimmory()之类的回调,但这些回调似乎是自愿的,这意味着如果应用程序与操

Android活动有一个定义良好的生命周期,它们将被暂停、停止和销毁。这是非常有记录的。我的问题是关于包含我的活动的任务

在内存不足或其他情况下,任务是否会被操作系统关闭?(我理解用户可以强制停止应用程序)

我可以假设我的单例数据和静态数据总是可用的吗

活动上定义的静态成员如何?看起来活动可能会被销毁,但静态数据的寿命与任务的寿命一样长

android.app.Application有onLowMemory()和ontrimmory()之类的回调,但这些回调似乎是自愿的,这意味着如果应用程序与操作系统合作,这是很好的,但它不必这样做。所以,我非常确定我的任务通常不会被终止,单例和静态是可靠的。这是正确的吗


也有一些好的背景。

我对你的问题非常好奇,所以我很快就用一个非常简单的项目做了一个简单的检查,我将发布我的发现-我将根据假设回答其余的问题,因为安卓的清理过程相当神秘

  • 创建了3个活动-A、B、C。A可以调用B或C。A是开始 点的应用程序。B和C不能调用任何东西。C有一个静态 整数成员x
  • x是C的类成员,最初没有任何值。我设定 它被转换为5,并在C的onCreate()中打印出来。它也被打印出来 在A的onResume()中
  • 当我启动这个应用程序时,一个祝酒词显示在一个屏幕上,上面写着0(C.x 尚未设置)。然后我导航到C。我得到一个祝酒词C=5
  • 然后我按下后退键回到A。我得到一个祝酒词c=5。C已经 毁灭
  • 然后我去B。不烤面包。回到A,我要干杯c=5
  • 从一开始,我按回家。在家里,我再次重新开始活动。我明白了 c=5
  • 我按back键回到家中(销毁A)。然后我重新打开门 应用程序。我得到c=5
  • 然后我返回并强制停止应用程序的设置。然后我重新开始 应用程序-我得到c=0。强制停止将完全删除此任务中的所有内容
由此可以说,即使在活动被销毁之后,静态值仍然存在。即使在应用程序关闭后,该值仍由Android保留

Can I assume my Singletons and static data will always be available?
我想说的是,只要Android没有被推到需要回收内存的地步,你就可以假设这一点

从Commonware的Android教程中,我了解到任何在后台运行的任务都被视为重要任务,不会被Android关闭。但是,如果另一个任务出现在前台,则该任务的优先级较高,而后台的所有任务的优先级较低。如果Android决定前台的任务需要更多内存,它将开始根据优先级顺序终止进程,这取决于许多因素。在内存不足的情况下,任何任务都可能被终止。在极端情况下,前台的任务本身可能会被终止

我希望这能回答你的问题。这确实引起了我的兴趣

我可以假设我的单例数据和静态数据总是可用的吗


你永远不能这样想。有时contex会发生更改(例如,当您转到“设置”并打开gps时),然后您的应用程序会被重新创建。操作系统可以随时破坏您的活动。即使在PC程序上,也不应对静态数据进行操作

在内存不足或其他情况下,操作系统可能会终止您的任务。当然,你的静态和单例也会随着任务而消失


如果您需要静态和单例在任务关闭和重新启动后生存,您需要将它们持久化到某个地方。他有很好的建议。我发现您可以利用onSaveInstanceState()将数据保存为save instance捆绑包的一部分。当活动恢复时,它将被恢复。请参见

你有你提到的那本书的链接吗?而且,听起来在极端的记忆条件下,我的任务可能会被终止。如果它被杀了,我的静力学和单身汉也就不见了。但我假设会调用Application.onLowMemory(),这样我就可以尝试保存状态或优雅地关闭。我记得有一篇文章特别提到,程序员不应该依赖Android在即将终止活动时调用回调,即onStop()和onDestroy()。扩展这一点,我不确定是否可以依赖它调用onLowMemory(),但我从未经历过。至于这本书,你可以访问commonware.com。这实际上是一种付费订阅——每年大约40美元。每个月都会有更新。这是迄今为止我所看到的最全面的指南。你是说活动被破坏还是任务被破坏?问题是关于任务。没关系,静态数据总是脆弱的。操作系统宁愿杀死整个应用程序,而不是只杀死一个活动。单例/静态数据是你能做的最糟糕的事情:)以其他方式更好地缓存它你是基于什么“操作系统宁愿杀死整个应用程序而不是只杀死一个活动”这句话的?