Android 在离开活动记录时如何处理后台话题?

2022-09-01 06:59:48

我需要我的Android应用程序在其活动被置于后台或被杀死时将其状态保存到磁盘。有人建议我在调用 onPause() 时启动一个线程,并在那里执行任何昂贵的 I/O 过程(请参阅为图像编辑器快速可靠地保存/加载文档状态)。

在什么情况下操作系统会杀死线程,这些情况发生的频率如何?

我假设这就像如何处理活动一样,操作系统可以任意决定杀死线程,但大多数情况下只会在资源非常有限的情况下这样做。不过,如果能找到一些具体的文档就好了。

通过一些测试代码,在onPause()中启动的后台线程将在我的设备上的后台无限期地运行(我尝试加载了很多应用程序,但无法将其杀死)。

对于我的特定应用,我正在编写一个位图编辑器,其中我使用命令模式和 Memento 模式来允许撤消和重做编辑。我希望用户能够撤消/重做他们的编辑,即使例如用户接到电话,并且活动在后台被杀死。我能想到的最好的解决方案是使用后台线程在应用程序使用期间不断将我的命令和memento对象保存到磁盘,并在调用onPause时完成保存后台线程中剩余的任何对象。在更糟糕的情况下,如果线程被杀死,我只会丢失一些编辑。


答案 1

在什么情况下操作系统会杀死线程,这些情况发生的频率如何?

操作系统不会杀死线程,除非它正在杀死进程 - Android不会对你自己创建的线程做任何事情。如果你是前台进程,你不会被杀死。Android在你失去前景(之后)的几秒钟内杀死这个过程的几率是微乎其微的。有关进程生存期的文档 - 它的内容 - 可以在这里找到。onPause()


答案 2

您的线程可能会在活动被破坏后随时被终止,或者可能永远不会被杀死。根据这样的线程是非常糟糕的形式 - 你最终可能会得到一个半完成的操作,或者一个永远存在的线程。

如果希望执行即使没有前台活动也能继续的后台操作,则几乎总是希望在服务中运行它。另一方面,服务不太可能被杀死,但除非您使用“startForeground”,否则无法保证。这最终会向用户显示一条通知,通知后台发生了一些事情,但据我所知,这是运行异步后台线程的唯一方法,保证不会被杀死。

老实说,正确的答案是确保永远不会有任何临时的进程状态需要很长时间才能保存。如果必须写入一个大文件以反映一些用户更改,请考虑维护一个“事务日志”,您可以使用该日志创建可重新启动的保存操作。鉴于此,您可以在服务中安全地运行保存,并知道即使它被终止,当资源可用时,它也会自动重新启动。


推荐