离开活动时Android如何处理后台线程?

时间:2010-10-10 00:22:25

标签: java android multithreading mobile

当我的Android应用程序将其活动放入后台或被杀死时,我需要将其状态保存到磁盘。有人建议我在调用onPause()时启动一个线程并在那里执行任何昂贵的I / O程序(参见Saving/loading document state quickly and robustly for image editor)。

在什么情况下操作系统会杀死线程以及这些情况发生的常见程度?

我假设它会像处理操作系统如何处理操作系统可以任意决定杀死线程一样,但是当资源非常有限时,大多只会这样做。尽管如此,找到一些具体的文档会很好。

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

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

3 个答案:

答案 0 :(得分:20)

  

在什么情况下操作系统会杀死线程以及这些情况发生的常见程度?

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

答案 1 :(得分:4)

您的线程可能会在活动被销毁后随时被杀死,或者可能永远不会被杀死。取决于这样一个线程是非常糟糕的形式 - 你可能最终完成一个半完成的操作,或者一个永远坚持的线程。

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

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

答案 2 :(得分:1)

通常情况下,如果速度很快,将状态保存在onPause是正确的。我不认为当一个进程被杀死时会清楚地记录它,但是当你运行一些要求苛刻的应用程序时(例如,在运行Google Earth和浏览器之后),你有时会在logcat中看到它。

Android DevTools中还有一个选项可以在您离开它们时自动销毁活动,尽管这可能不会扩展到该过程。 (DevTools在模拟器上,在一些有根的手机上)。

我认为你的方法合理 - 使用低优先级线程不断更新保存数据,并在onPause中给它正常的优先级,并在onPause中设置一个标志,告诉它在完成后终止。

显然,如果你在onPause之后立即进入onResume,你需要确保不会遇到同步问题(即线程仍在忙着保存)。

相关问题