Android应用程序类生命周期文档

6
我正在寻找关于Android应用程序类生命周期的官方文档。根据我在StackOverflow上这里这里找到的内容,如果系统需要内存,Application类可能会被终止。即使这篇教程也是如此。
但是有几件事情让我有点不爽:
  • 我找不到任何官方文档告诉我,Application类确实可以在低内存时被终止。
  • 我找不到任何官方图表来表示Application生命周期。
  • Application类被终止时,我找不到任何适当的回调函数可供使用,除了onLowMemory()。这是否意味着我必须使用此方法来保存我的数据?
  • 如果Application类在低内存压力下被终止,并且应用程序再次进入前台,我如何在其onCreate()中知道应用程序已在系统终止后重新创建?在Activity中,我会测试savedInstanceState,但据我所知,在Application类中没有类似的东西。
感谢您的解答。

这并不直接相关,但可能会有用。http://hsc.com/blog/best-practices-for-memory-optimization-on-android-1 - Maytham Fahmi
另一个有趣的链接 https://dev59.com/lW455IYBdhLWcg3wAvXQ?lq=1 - agonist_
感谢您提供的链接。 - E-Kami
@CommonsWare 那个实例会一直存在,直到进程被终止 你所说的进程是什么类型?如果你指的是应用程序被杀死,那么你的假设是错误的。即使应用程序仍在运行,Application 单例也可以被终止。 - E-Kami
1
“你在谈论什么类型的进程?”——操作系统进程。“即使应用程序仍在运行,应用程序单例也可以被终止”——欢迎您发布一个演示此问题的示例应用程序。也许您对“仍在运行”的定义与计算机程序员使用的不同。例如,概述屏幕(又称最近任务列表)不显示正在运行的进程,而是显示最近的任务。 - CommonsWare
显示剩余4条评论
2个回答

4
我找不到官方文档告诉我应用程序类可以在低内存时被杀死。
下面是提到它的引用: 我也找不到任何官方图表来表示应用程序生命周期。
尽管以下是基于观点,但我最好的猜测是这样的图表会与 Android 的多任务“哲学”相矛盾,如最后提供的参考所述:
Android应用程序处理的关键在于,进程不会干净地关闭。当用户离开一个应用程序时,它的进程仍然在后台运行,如果需要,它可以继续工作(例如下载网页),并且如果用户返回该应用程序,则可以立即将其置于前台。如果设备从未耗尽内存,则Android将保留所有这些进程,确实使所有应用程序一直“运行”。
引用中提到的onLowMemory()是Application类被杀死时使用的回调函数,但我找不到其他适当的回调函数。这是否意味着我必须使用此方法来持久化我的数据?
关于onLowMemory(),它的描述非常简单明了,我们是否正在谈论后台进程或前台UI?...
如果没有任何应用程序的Activities在前台运行且操作系统内存不足,它可能会终止该应用程序,以便不会调用任何Application或应用程序组件(ActivityService)的回调。也就是说,(由于你正在处理Activities),我建议按照文档中的要求将所有持久数据存储在onPause()中,使其更易于理解。

如果应用程序类在低内存压力下被终止并且应用程序再次进入前台,如何在其onCreate()中知道应用程序已经在系统终止后重新创建?

您无法在ApplicationonCreate()中识别它。


当应用程序在其进程被关闭后回到前台时,应用程序类的onCreate方法会在启动器/主活动的onCreate方法之前被调用吗? - the beest
1
当然,首先需要实例化一个“Application”实例,然后创建其他应用程序组件(“Activities”,“Services”)。 - Onik

1
据我所知,您无法处理应用程序被杀死的事件。以下是Application的onTerminate方法的引用:
此方法用于模拟处理环境。在生产Android设备上,进程通过简单地终止它们来删除它们;在这样做时不执行任何用户代码(包括此回调)。
总体思路是您不应关心应用程序是否已被杀死。如果是,则操作系统将在下次需要时重新启动应用程序,否则将恢复(并且您将使用Activity / Fragment生命周期事件来实现此目的)。
您需要存储什么数据-是否可以在最后一刻之前存储它(当从Web服务接收到它等)?

我使用它来存储需要在所有活动中保持引用的单例对象。其中一些对象不是Parcelable类型,无法转换为该类型。我知道不能依赖于onTerminated方法,但令人烦恼的是缺乏关于Application生命周期的官方文档。 - E-Kami
如果您的应用程序被杀死,所有的单例也将会被回收。下次需要它们的时候,您无法重新创建它们吗?作为替代方法,您可以尝试使用Dagger(http://google.github.io/dagger/),并在需要使用单例的任何位置进行注入(您可以将它们标记为单例,这样Dagger会确保只使用一个实例)。 - Samuil Yanovski
是的,我知道它们将被垃圾回收,但我想知道的是为什么会这样(来自官方来源)。而且,一旦被垃圾回收,我就无法再获取它们了。对我来说,使用dagger还不是一个解决方案,因为这只是绕过问题的问题。此外,我将在新的即将推出的Jack编译器和Dagger中遇到一些困难。 - E-Kami
“为什么会是这样”的意思是什么?当您的应用程序被终止时,整个应用程序进程都会被销毁,因此应用程序分配的所有内容都将在下一次应用程序从头开始启动时进行垃圾回收并重新创建。 - Samuil Yanovski
当您的应用程序被杀死时,整个应用程序进程都会被销毁。这正是问题所在,即使应用程序一直在前台运行,应用程序类也可能被杀死,而应用程序进程并没有被销毁。许多用户相信Application类是安全的,但实际上缺乏有关其生命周期的文档,这种假设是错误的。 - E-Kami
我没有遇到过这种行为——在事情仍在运行时杀死应用程序。根据文档(http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle),如果需要,操作系统可以杀死活动的进程。因此,如果您运行多进程应用程序,则您的应用程序对象可能在仅运行后台活动的进程中,并且可能会被杀死——尽管这只是一种理论。 - Samuil Yanovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接