为啥在 IntentService 中进行的 BLE 扫描即使在服务被破坏时也能继续工作?

Posted

技术标签:

【中文标题】为啥在 IntentService 中进行的 BLE 扫描即使在服务被破坏时也能继续工作?【英文标题】:Why a BLE scanning made in an IntentService keeps on working even when the service is destroyed?为什么在 IntentService 中进行的 BLE 扫描即使在服务被破坏时也能继续工作? 【发布时间】:2017-09-24 10:31:33 【问题描述】:

我在 android 中开发的第一个应用程序涉及后台 BLE 扫描。该应用程序有两个按钮来启动服务(进行扫描并记录结果)和停止服务。

从documentation我了解到Service和IntentService的区别。我怀疑使用 IntentService 不是最好的方法,因为 Android 系统会在处理传递给它的所有意图时破坏服务,因此在服务创建的工作线程中运行的扫描也会停止工作。但是,我想尝试一下以测试我的知识。

正如我所料,服务在创建后几乎立即被销毁。但是,通知检测到的新设备的日志不断出现,这意味着即使服务被破坏,扫描过程也会继续工作。当我关闭主要活动时,扫描最终停止。我想知道为什么扫描过程似乎绑定到主要活动的线程而不是意图服务创建的线程(自动)。为什么即使服务已被破坏,扫描过程仍然有效?

我找到了一些与服务和 BLE 扫描相关的 SO 答案(here 和 here),但没有人解决这个特定主题。你能给我一些帮助吗?

【问题讨论】:

你能显示你的 IntentService 的代码吗? 【参考方案1】:

根据Process Priorities blog post:

Android 不会仅仅为了杀死事物而去杀死事物(请记住:从头开始不是免费的!),因此这些进程可能会保留一段时间,然后由于任何事物的内存需求而被回收在更高的类别中,按照最近最少使用的顺序被杀死(最旧的首先被回收)。

因此,即使您的服务已停止,您的进程也可以在内存中保留一段时间。由于您没有专门停止对 onDestroy 的 BLE 扫描,因此该工作将继续进行,直到您的进程被终止以回收内存。

【讨论】:

感谢您的回答。也许我不明白线程和进程之间的区别。我知道即使我的一个组件已被破坏(例如服务),我的进程也可以保持活动状态。但是我无法理解即使线程已被销毁(服务被销毁时会发生这种情况),已被编程为在特定线程中执行的任务如何保持执行。我将线程和进程理解为不同的概念。 根据BluetoothLeScanner source code,它会在主线程上提供结果——仅仅因为您在onHandleIntent 的后台线程中注册扫描结果并不会将回调绑定到该线程。

以上是关于为啥在 IntentService 中进行的 BLE 扫描即使在服务被破坏时也能继续工作?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 IntentService 还是 Service 进行 UI 更新?

Android中使用IntentService运行后台任务

Android中使用IntentService运行后台任务

IntentService的使用

Android 我应该使用 AsyncTask 还是 IntentService 进行 REST API 调用? [复制]

使用 IntentService 进行位置监听,但在 onHandleIntent 之后立即调用 onDestroy