【问题标题】:How to manage stopping a Service with a long-running onDestroy?如何使用长时间运行的 onDestroy 管理停止服务?
【发布时间】:2015-08-11 15:14:47
【问题描述】:

我有一个长期运行 onDestroy 的 android Service 类。我需要防止这种情况发生,因为当有活动运行时它会导致挂起。

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

这些解决方案中的任何一个都是明智的,还是有其他方法?

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    关闭 Intent 是一种合理的方式。

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


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

    来自official Documentation

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

    此方法通常用于释放资源,例如与活动相关联的线程,以便被破坏的活动在其应用程序的其余部分仍在运行时不会留下这些东西。在某些情况下,系统会简单地终止 Activity 的托管进程而不在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。

    这里的Documentation 专门用于服务:

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

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

    【讨论】:

    • It might be called or not called when you don't expect or want it. - 我不同意使用它是个坏主意。如果来电 - 你必须释放资源,不管你喜不喜欢。
    • 感谢您的回答。毫无疑问,应用程序随时可能被终止,因此确实应该尽快保存重要数据。我保存的一些数据是非关键的。其他数据可能更重要。不幸的是,我正在分叉一个复杂的现有项目,所以我要做的是检查并确保现有代码在需要时保存数据。
    【解决方案2】:

    您应该知道,没有绝对保证onDestroy 会被执行。

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

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

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

    如果是服务器消息 - 这有点复杂。我喜欢您将命令发送到Service 而不是调用stopService 的想法。其他选择是从您的onDestroy 开始另一个拆卸Service,这将执行长时间运行的操作并自行关闭。

    【讨论】:

    • 您好,感谢您的回答。我之前听说过 onDestroy 不能保证被调用,但我从未在文档中看到过这个。你知道这方面的任何官方文件吗?我需要将一些数据保存到存储中,因此使用 Intent 似乎确实可以确保在服务停止之前完成保存操作。活动有可能希望服务在停止时再次运行。也许在这种情况下,服务可以安排自己在停止后重新启动。
    • @MatthewMitchell 它没有记录在案,但您的进程可能会被系统杀死,以防出现以下情况:完成时间过长、崩溃、用户强制停止应用程序等。它是由系统决定,因此没有严格定义。我想说将数据保存在onDestroy 中是个坏主意,无论您如何实现它。如果您尽快保存数据会更可靠——无论是在您获取数据之后直接保存还是每隔一段时间保存一次。
    • @DmitryZaitsev 它实际上已记录在案,但仅适用于活动。但这也适用于服务 - 请参阅我的答案
    • @F43nd1r 它仍然是Activity 的文档,而不是Service - 这就是我所说的not documented。然而,想法是一样的——不要把东西保存在onDestroy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多