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

use*_*771 52 android android-service

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

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

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

kab*_*uko 34

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


Mar*_*och 12

有两件事需要考虑:

  1. Android可能会决定在某个时刻关闭某个进程,此时内存不足并且需要更快立即为用户提供服务的其他进程.因此,在被杀死的进程中运行的应用程序组件将被销毁.当这些组件再次为它们工作时,将再次启动该过程. 在这种情况下onDestroy()不会被调用,因为Android操作系统无论如何都会回收资源(这是OS的基本任务 - 如果你不知道的话).
  2. 服务既可以启动,也可以绑定连接.在这种情况下,只要系统启动或者使用Context.BIND_AUTO_CREATE标志有一个或多个连接,系统就会保持服务运行.一旦这些情况都不成立,就会调用服务的onDestroy()方法并有效终止服务.从onDestroy()返回时,应完成所有清理(停止线程,取消注册接收器).因此,当Android OS看到Service已经完成其工作并且不再需要时 - 它将被Android OS摧毁.Android操作系统为开发人员提供了释放服务资源的机会,不会导致内存泄漏.在这种情况下onDestroy()被称为因为这是开发人员可以释放资源的地方.当然,在这种情况下,应用程序的进程保持不变(因为可能在其中运行其他服务/活动).

  • 我认为你做错了,因为我从来没有经历过这样的行为 - Android要么杀死整个过程(你不必担心所有资源都被收回)或者破坏服务(调用onDestroy ()上面 - 你自己发布资源,因为进程仍然在运行).如果它不会以这种方式工作那么它将毫无意义,因为没有人能够释放资源,它会导致内存泄漏.荒诞! (2认同)