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

mem*_*com 31 java mobile multithreading android

我需要我的Android应用程序将其状态保存到磁盘,当它的活动被放入后台或被杀死时.有人建议我在调用onPause()时启动一个线程,然后在那里执行任何昂贵的I/O程序(请参阅快速,健壮地保存/加载文档状态,以便进行图像编辑).

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

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

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

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

Com*_*are 20

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

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

  • @tifftuff:活动不是应用程序.活动是应用程序的一个组件.应用程序可能包含许多组件,包括多个活动,服务等.当应用程序的最后一个组件被销毁时(例如,用户从小型应用程序中的一次性活动中按下BACK),该过程将被指定用于回收或终止.不要漏线.如果您启动该主题,您必须安排它终止,因为Android不会为您终止它,除非通过终止该过程,这可能在几周内不会发生. (3认同)
  • @memcom:线程和服务是正交的 - 选择一个并不能消除另一个的选择.在UI方面,服务自动处于后台...... 从线程角度来看,它们运行在您的活动使用的相同主应用程序线程上.因此,服务所花费的时间将占用UI,可能导致应用程序不响应(ANR)异常.因此,我希望许多服务将使用`AsyncTask`或他们自己的线程管理.换句话说,它不是"服务或线程",而是"服务*和*线程". (3认同)
  • 只是澄清一下,如果您在附加到某个活动的进程中创建一个线程,那么该线程会在活动被杀死时被杀死(即进程和线程是链接的)? (2认同)