Android 如何管理使用长时间运行的onDestroy停止服务?

Android 如何管理使用长时间运行的onDestroy停止服务?,android,android-service,Android,Android Service,我有一个android服务类,它有一个长期运行的onDestroy。我需要防止这种情况,因为当有活动正在运行时,它可能会导致挂起 似乎有些人很乐意在onDestroy方法中启动一个线程/异步任务来保存长时间运行的代码,尽管我担心线程可能会被杀死。另一种解决方案可能是使用startService而不是stopService,其目的是告诉服务启动关闭线程,该线程在结束时调用stopSelf 这些解决方案中有哪一种是合理的,还是有其他方法?您应该知道,执行onDestroy没有绝对的保证 似乎有些人很

我有一个android服务类,它有一个长期运行的onDestroy。我需要防止这种情况,因为当有活动正在运行时,它可能会导致挂起

似乎有些人很乐意在onDestroy方法中启动一个线程/异步任务来保存长时间运行的代码,尽管我担心线程可能会被杀死。另一种解决方案可能是使用startService而不是stopService,其目的是告诉服务启动关闭线程,该线程在结束时调用stopSelf


这些解决方案中有哪一种是合理的,还是有其他方法?

您应该知道,执行
onDestroy
没有绝对的保证

似乎有些人很乐意在onDestroy方法中启动一个线程/异步任务来保存长时间运行的代码,尽管我担心线程可能会被杀死

我假设您正在尝试释放一些资源或向服务器发送某种消息

在资源的情况下,并没有必要担心-若你们要启动新的线程,那个么它只会和托管进程(你们的应用程序)一起被终止。若发生这种情况,那个么系统会为你们释放资源


在服务器消息的情况下-这有点复杂。我喜欢您将命令发送到
服务
而不是调用
停止服务
的想法。另一种选择是从您的
onDestroy
启动另一个拆卸
服务,该服务将执行长时间运行操作并自动关闭。

关闭意图是一种合理的方式

不过,在onDestroy中启动另一个线程是个坏主意。当您不期望或不想要它时,它可能会被调用,也可能不会被调用


编辑:保存重要信息这两种方法都不是好主意。 您无法确保这些方法在进程终止之前实际运行。对于不重要的数据,您当然可以采用这些方法,但最好在获得数据后立即保存,或者至少在固定的时间间隔内保存(如果您有连续的数据输入)

从:

注意:不要指望调用此方法作为保存数据的位置!例如,如果活动正在编辑内容提供程序中的数据,则这些编辑应在onPause()或onSaveInstanceState(捆绑包)中提交,而不是在此处提交

此方法通常用于释放资源,如与活动关联的线程,以便在其应用程序的其余部分仍在运行时,已销毁的活动不会留下此类内容。在某些情况下,系统会简单地终止活动的宿主进程,而不在其中调用此方法(或任何其他方法),因此不应使用它来执行在进程结束后仍保留的操作

以下是服务的具体说明:

由系统调用以通知服务它已不再使用并且正在被删除。此时,服务应该清理它持有的任何资源(线程、注册的接收者等)。返回后,将不再有对该服务对象的调用,并且它实际上已死亡


(我已经包括了活动文档,因为它更精确)

当您不期望或不想要它时,可能会调用或不调用它。
-我不同意使用它是个坏主意。如果电话来了,你必须释放资源,不管你喜欢与否。谢谢你的回答。毫无疑问,应用程序可能会在任何时候被终止,因此确实应该尽快保存重要数据。我正在保存的某些数据不重要。其他数据可能更重要。不幸的是,我正在分叉一个复杂的现有项目,所以我要做的是仔细检查并确保现有代码在需要时保存数据。您好,谢谢您的回答。我以前听说onDestroy不能保证被调用,但我从未在文档中看到过。你知道这方面的官方文件吗?我需要将一些数据保存到存储器中,因此,似乎使用意图来确保在服务停止之前完成保存操作是有意义的。活动可能希望服务在停止时再次运行。在这种情况下,服务可能会安排自己在停止后重新启动。@Matthew Mitchell没有记录,但您的进程可能会被系统终止,以防:完成时间过长、崩溃、用户强制停止应用程序等。这取决于系统,因此没有严格定义。我想说,无论您如何实现,将数据保存在
onDestroy
中都是一个坏主意。如果您能尽快保存数据,则会更加可靠—要么在获得数据后直接保存,要么每隔一段时间保存。@DmitryZaitsev它实际上是有文档记录的,但仅用于活动。但它也适用于服务-参见我的answer@F43nd1r它仍然是
活动
的文档,而不是
服务
——这就是我所说的
未文档化
。不过,想法是一样的——不要在
onDestroy
中保存内容。