android服务是否可以保证调用onDestroy()?

时间:2011-08-29 22:34:50

标签: android android-service

android上的Activity的生命周期图并不保证会调用onDestroy(),但是可能会终止该进程并突然删除Activity。 android上的服务的生命周期图确保了将调用onDestroy()。所以我有两个与这种差异有关的问题。

首先,如果Service是与Activity相同的进程的一部分,那么是否调用了Service onDestroy(),虽然没有调用Activity onDestroy()?我不这么认为,因为“杀死进程”表明操作系统正在停止其线程并释放其资源。

如果是这样的话,操作系统是否会突然杀死仅服务进程?

2 个答案:

答案 0 :(得分:31)

我不确定您在哪里看到服务可以保证onDestroy()被调用。据我所知,情况并非如此。如果您阅读了文档的this页面,它会描述可以杀死服务的条件。因此,如果您询问是否有一个同时托管活动和服务的进程被杀死,那么将在服务上调用onDestroy()(但不会在活动上调用),那么答案是否定的;服务的onDestroy()不一定会被调用。至于服务操作系统是否可以突然杀死仅服务进程:是的,它可以。当你有很多工作要做时,尤其如此,你的onStartCommand调用只会将工作排队异步进行。然后,该服务将花费大部分时间不在受保护的onCreateonStartCommandonDestroy方法中。

答案 1 :(得分:11)

有两件事需要考虑:

  1. Android might decide to shut down a process at some point, when memory is low and required by other processes that are more immediately serving the user. Application components running in the process that's killed are consequently destroyed. A process is started again for those components when there's again work for them to do. 在这种情况下,onDestroy()不会被称为,因为Android操作系统无论如何都会回收资源(这是操作系统的基本任务 - 如果你没有'我知道)。
  2. A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy().因此,当Android操作系统发现服务已完成其工作且不再需要时 - 它将被Android操作系统破坏。 Android操作系统为开发人员提供了释放服务资源的机会,不会导致内存泄漏。 在这种情况下,onDestroy()被称为,因为这是开发人员可以释放资源的地方。当然,在这种情况下,应用程序的流程保持不变(因为其中可能还有其他服务/活动)。