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



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

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

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

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

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

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

来自官方文档:

注意:不要指望调用这个方法作为保存数据的地方!例如,如果一个活动在内容提供程序中编辑数据,这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在这里。

此方法通常用于释放与活动相关的线程等资源,以便在应用程序的其余部分仍在运行时被销毁的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或任何其他方法)的情况下杀死活动的托管进程,因此它不应该用于在进程消失后保留的事情。

这里是专门针对服务的文档:

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

(我包含了Activities文档,因为它更精确)

您应该意识到onDestroy的执行是没有绝对保证的。

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

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

在资源的情况下,没有必要担心-如果你启动一个新的线程,它只会与托管进程(你的应用程序)一起被杀死。如果发生这种情况-没关系,系统会为您释放资源。

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

最新更新