Android任务生命周期和静态数据,是否曾被破坏过?

时间:2014-03-18 17:17:04

标签: java android android-activity android-lifecycle

Android活动具有明确定义的生命周期,它们将被暂停,停止和销毁。这是有据可查的。我的问题是关于包含我的活动as described in the docs的任务。

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

我可以假设我的单身人士和静态数据始终可用吗?

在Activity上定义的静态成员怎么样?似乎活动可能被破坏,但只要任务存在,静态数据就会存在。

android.app.Application有回调,如onLowMemory()和onTrimMemory(),但这些似乎是自愿的,这意味着如果应用程序与操作系统合作,它是很好的,但它不是必须的。所以,我很确定我的任务通常不会被杀死,单身人士和静力学也是可靠的。这是对的吗?

This answer也有一些很好的背景。

3 个答案:

答案 0 :(得分:2)

我对你的问题非常好奇,所以我很快就通过一个非常简单的项目进行了简单的检查,并且我发布了我发现的内容 - 我将根据假设解答其余的问题,因为Android'清理过程非常神秘。

  • 创建3个活动 - A,B,C。A可以呼叫B或C.A是起点 应用程序的重点。 B和C不能打电话。 C有一个静态的 整数成员x。
  • x是C的类成员,最初没有任何值。我设置 它到5并在C的onCreate()中打印出来。它也被打印出来 在A的onResume()中出来。
  • 当我启动应用程序时,在A上显示一个toast,表示0(C.x 尚未设定)。然后我导航到C.我得到一个烤面包c = 5.
  • 然后我按回去,然后回到A.我得到一个吐司c = 5。 C已经 破坏。
  • 然后我去B.没有吐司。回到A.我得到一个祝酒词c = 5.
  • 从A,我按回家。从家里,我再次重新开放活动。我明白了 C = 5。
  • 我按回去回家(摧毁A)。然后我重新打开了 应用程序。我得到c = 5.
  • 然后我回去强制停止应用程序的设置。然后我重新打开 应用程序 - 我得到c = 0。强制停止会完全删除此任务中的所有内容。

由此可以说,即使在销毁活动后,静态值仍然存在。即使应用程序关闭后,Android仍会保留该值。

Can I assume my Singletons and static data will always be available?

我想说,只要Android没有被推到决定需要回收内存的程度,你就可以假设这一点。

在Commonware的Android教程书中,我了解在后台运行的任何任务都被视为一项重要任务,并且不会被Android关闭。但是如果另一个任务到达前台,那么这将被赋予更高的优先级,并且后台中的所有任务都具有更低的优先级。如果Android决定前台任务需要更多内存,它将根据优先级顺序开始查杀进程,这取决于许多因素。在内存不足的情况下,任何任务都可能被杀死。在极端情况下,前景本身的任务可能会被杀死。

我希望这能回答你的问题。它肯定引起了我的兴趣。

答案 1 :(得分:0)

  

我可以假设我的单身人士和静态数据始终可用吗?

你永远不能假设。有时上下文更改(例如,当您转到设置并打开gps时),然后您的应用程序正在重新创建。操作系统可以随时破坏您的活动。即使在PC程序上也不应该使用静态数据

答案 2 :(得分:0)

似乎操作系统可以在低内存和其他情况下终止你的任务。而且,当然,你的静力学和单身人士会死于这项任务。

如果你需要你的静力学和单身人士来完成任务关闭和重启,你需要在某个地方坚持下去。 Android Application Framework FAQ有很好的建议。我发现您可以利用onSaveInstanceState()并将数据保存为save实例包的一部分。恢复活动时将恢复它。见Controlling Android Activity restart after a process stops