【问题标题】:Do threads continue to run after service is closed by android?android关闭服务后线程是否继续运行?
【发布时间】:2016-08-13 00:47:39
【问题描述】:

在我的主活动中的 onCreate 上调用了一项服务。 该服务从服务类(不是 IntentService)扩展 - 在该服务中,调用一个线程,该线程有一个无限循环 - 如果线程抛出任何异常,它会关闭服务并重新调用服务(由 try catch 块处理) .

最终,无论出于何种原因,该服务都被 android 关闭了。

请回答以下问题:

A) 我的线程是否继续运行?

.....如果是这样,如果将来任何时候抛出异常,它会召回服务吗?

....如果没有,是否会抛出异常导致服务重新启动?

B) android 在关闭我的服务时会关闭我的线程吗?

我只是想了解当 Android 决定清除我的服务时我的应用程序会发生什么。

【问题讨论】:

    标签: android multithreading service


    【解决方案1】:

    只要线程在运行,它就被认为是“垃圾收集根”。因此,线程本身和从该线程可访问的任何其他对象都不会被垃圾收集。如果 Android 框架不干预,一个无限循环的线程将继续无限期地运行。由于您的线程可以“关闭”服务,我假设它具有对服务的引用(隐式或显式),因此整个服务将保留在内存中。

    不过,Android 确实有一些方法可以监控应用程序的内存消耗,并且可以终止应用程序以释放内存。当Android杀死一个应用程序时,它会杀死该应用程序的整个进程。当进程被杀死时,所有线程都会停止并释放与其相关的内存,因此不会发生进一步的活动。

    这似乎是您的服务的结束,但 Android 提供了额外的机制来控制在这种情况下发生的事情:您可以将服务指定为 STICKY,Android 将尝试尽快重新启动服务。在this answer中有详细讨论。

    参考资料:

    此答案中提供的大部分信息都包含在official Services page 和javadoc of service class 中。

    对于Service 在另一个进程中运行的更复杂的场景,几乎没有文档,但是那里有很多博客。我还写了一篇关于这个主题的帖子:How to establish a reliable (crash and kill tolerant) connection to bound IPC (e.g. AIDL) Service in Android

    【讨论】:

    • 哇,非常感谢,这正是我想知道的 :) 你听起来确实很了解你的东西。请问这是在哪里记录的?不是因为我认为你错了,而是我有很多问题 - 自己查找会更容易:P
    • @AndroidStudent,不客气。我在答案末尾添加了一些参考文献
    • 非常感谢 - 非常有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2021-01-01
    • 1970-01-01
    • 2019-08-05
    • 2020-05-27
    • 2012-02-20
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多