【问题标题】:Is an android service guaranteed to call onDestroy()?android 服务是否保证调用 onDestroy()?
【发布时间】:2011-11-06 09:33:16
【问题描述】:

android上Activity的生命周期图并不能保证onDestroy()会被调用,但是进程可能会被杀掉,Activity会被突然移除。 android 上 Service 的生命周期图确实保证会调用 onDestroy()。所以我有两个关于这种差异的问题。

首先,如果 Service 与 Activity 属于同一进程,那么 Service onDestroy() 是否被调用,而 Activity onDestroy() 没有被调用?我认为不会,因为“杀死进程”表明操作系统正在停止其线程并释放其资源。

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

【问题讨论】:

    标签: android android-service


    【解决方案1】:

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

    【讨论】:

    • 那个链接是我想看到的。谢谢!我只是被生命周期图弄糊涂了,因为一个显示了进程被杀死的情况,而另一个没有。然而,我认为后者是隐含的。只是不知道在哪里验证我的想法。
    • 当您需要在关闭前清理服务时如何获得通知?例如,我想缓存一些状态并在关闭之前将其刷新到存储中;如果我从来没有被告知我要关闭,我将失去我的状态 - 不好!
    • @Michael 考虑定期/每当您的数据更改时将其刷新到存储中。这是一个合理的问题。事实上,如果我的简单答案不能让您满意,那么值得发布您自己的问题以获得一些好的深入答案。
    • @kabuko:不,很高兴知道这一点。我最初阅读的文档建议 onDestroy 将被调用,所以我决定它可以节省大量电池和闪存擦除周期,以便在状态更改时不刷新,但是......对于这个想法来说太多了。我决定拆分我的状态,以便不频繁的更改(
    • "因此,如果您询问是否正在终止同时托管活动和服务的进程,是否会在服务上调用 onDestroy()(但不在活动上),那么答案是否定的; 服务的 onDestroy() 不一定会被调用。”你怎么知道?这是否记录在某处?
    【解决方案2】:

    有两点需要考虑:

    1. Android 可能会在某个时候决定关闭进程,当内存 低并且其他更直接的进程需要 为用户服务。在进程中运行的应用程序组件 杀死因此被摧毁。再次启动一个进程 当他们再次有工作要做时,这些组件。 Source

      在这种情况下,onDestroy() 不会被调用,因为 Android 操作系统无论如何都会回收资源(这通常是操作系统的基本任务)。

    2. 服务既可以启动也可以绑定连接。在 在这种情况下,系统将保持服务运行,只要 它要么已启动,要么与它有一个或多个连接 Context.BIND_AUTO_CREATE 标志。一旦这两种情况都没有 持有,服务的 onDestroy() 方法被调用,服务是 有效终止。所有清理(停止线程,注销 接收器)应在从返回时完成 销毁()。 Source

      因此,当 Android 操作系统注意到 Service 已完成其工作并且不再需要它时,它将被销毁。操作系统让应用程序有机会释放服务的资源以防止内存泄漏。 在这种情况下,onDestroy() 被称为,因为这是应用程序可以释放其资源的地方。当然,在这种情况下,应用程序的进程保持不变(因为其中可能正在运行其他服务/活动)。

    【讨论】:

    • Once neither of these situations hold != guaranteed != always
    • 所以?这条评论是关于什么的?你引用了官方文档的一部分,所以?
    • 我引用了与您相同的官方文档部分。它说Once neither of these situations hold, the service's onDestroy() method is called。这仍然意味着即使在两种情况下都不会在没有调用 onDestroy 的情况下杀死服务。在实践中,这恰好是真的。
    • 是的,它在Service 以正常方式停止时调用(例如通过stopSelf)。当Service 被杀死(被系统)时,它并不总是被调用
    • 我认为你做错了,因为我从未经历过这样的行为 - Android 要么杀死整个过程(而且你不必担心任何事情,因为你的所有资源都被回收了)或销毁服务(在其上调用 onDestroy() - 您已自行释放资源,因为进程仍在运行)。如果它不能以这种方式工作,那么它将毫无意义,因为没有人能够释放资源并且会导致内存泄漏。荒谬!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多