首先,如果Service是与Activity相同的进程的一部分,那么即使Activity的onDestroy()方法没有被调用,Service的onDestroy()方法也会被调用吗?我认为不会,因为“杀死进程”意味着操作系统停止其线程并释放其资源。
如果是这种情况,操作系统能否突然杀死仅包含Service的进程呢?
我不确定您在哪里看到了一个Service一定会调用onDestroy()
的保证。据我所知,情况并非如此。如果您阅读文档中的这一页,它描述了服务可能被杀死的条件。因此,如果您问的是一个同时托管活动和服务的进程正在被杀死时,服务(但不是活动)是否会调用onDestroy()
,那么答案是否定的;服务的onDestroy()
不一定会被调用。至于只有服务的进程是否可以被操作系统突然杀死:是的,它可以。尤其是当您有大量工作要做,并且您的onStartCommand
调用仅将工作异步排队时。那么服务将花费大部分时间不在受保护的onCreate
、onStartCommand
或onDestroy
方法中。
需要考虑两个问题:
当内存不足并被其他更紧急的进程所需时,Android可能会决定在某个点关闭进程。因此,在被杀死的进程中运行的应用程序组件也会被销毁。当它们再次有任务要执行时,将为这些组件启动一个新进程。来源
在这种情况下,onDestroy()
不会被调用,因为Android操作系统总体上都会回收资源。
一个服务可以同时被启动和绑定。在这种情况下,只要服务已经被启动或者存在一个或多个使用Context.BIND_AUTO_CREATE标志连接到它的连接,系统就会保持服务运行。一旦不再满足这些情况之一,服务的onDestroy()方法就会被调用,服务也会被有效地终止。所有清理工作(停止线程,注销接收器)都应该在从onDestroy()返回时完成。来源
所以,当Android操作系统注意到服务已经完成任务并且不再需要时,它将被销毁。操作系统给应用程序一个机会来释放服务的资源,以防止内存泄漏。在这种情况下, onDestroy()
会被调用,因为这是应用程序可以释放资源的地方。当然,在这种情况下,应用程序的进程保持不变(因为可能还有其他正在其中运行的服务/活动)。
onDestroy
方法。” - Dmitry ZaytsevstopSelf
)停止Service
时会调用它。但是当系统杀死Service
时,并不总是会调用它。 - Dmitry Zaytsev
onDestroy
没有被调用。 - Dmitry Zaytsev