【问题标题】:How do you detect from a service that the app process has closed?您如何从服务中检测到应用进程已关闭?
【发布时间】:2014-03-20 19:00:00
【问题描述】:

我有一个由服务和各种活动组成的 Android 应用。当应用启动时,Service 使用 startService(Intent service) 启动。各种活动(但不是所有活动)绑定到服务并从中发送/接收消息。当应用程序在任何活动的前台或后台时,服务应该处于活动状态,但应该在整个应用程序关闭时结束(即用户从最近的应用程序屏幕滑动应用程序)。

我如何从服务(当前从未停止运行,直到您在设备上手动停止它)确定应用进程已结束,以便我可以停止服务?

【问题讨论】:

  • 您可以在服务中的活动上检查静态变量是否为 null,因此如果变量为 null,则活动已经完成
  • 请不要这样做。它会导致非常糟糕的代码设计和您无法预测的问题,从内存泄漏开始。
  • @Artyomcool 现在已经意识到我遇到的问题实际上与 Android 上的低功耗蓝牙有关。一些设备过滤广告数据包,而另一些设备则被它们淹没。在后者上运行我的应用程序时,即使在关闭应用程序、强制停止服务、卸载应用程序、甚至关闭并重新打开蓝牙之后,BLE 发现扫描也永远不会结束......

标签: java android service


【解决方案1】:

由于服务希望与其他所有服务都属于同一进程,因此不会通知该进程已终止,因为该进程将终止,因此该服务的代码将不再运行。没有进程被终止的预先警告。

如果出于某种原因您将服务置于单独的进程中,请重新考虑。

另外,请注意IntentService 并不是真正为与绑定模式一起使用而设计的。 IntentService 专为事务性工作而设计,在后台线程上执行。将IntentService 用于其他任何内容都是一种主要的代码异味。

【讨论】:

  • 奇怪的是,在应用程序/进程停止(0 个进程和 1 个服务)后,服务的代码正在运行。它继续执行其操作,例如扫描 BLE 设备、与范围内的设备配对等
  • @D.Wescotty 当您从尊贵的人那里得到答案时,您可以检查当前的活动堆栈,看看您的任何活动是否处于顶部或正在运行,如果没有,请停止自我。
  • @D.Wescotty:“在应用程序/进程停止(0 个进程和 1 个服务)后,服务的代码正在运行”——根据定义,这是不可能的。如果您没有进程,则您的代码没有运行。现在,可能发生的情况是,如果您从onStartCommand() 返回类似START_STICKY 的内容,Android 可能正在重新启动您的进程,尽管它应该显示在那里。 START_NOT_STICKY 可能是更好的选择。
  • 可能会发生另一件事 - 进程没有停止
【解决方案2】:

只是不要手动启动服务。当您从活动中绑定它时,它会自动启动和关闭。

【讨论】:

  • 这个问题是不是应用程序中的所有活动都绑定到服务。无论当前活动是否绑定到它,它都应该在应用程序的整个生命周期中运行。它应该只在应用完全关闭时停止处理
  • 服务不是以这种方式设计的,所以你不能在没有durty hacks的情况下做到这一点
  • 而且您还应该意识到,从最近的应用中刷卡并不一定会停止进程。
  • @Artyomcool:AFAIK 确实如此,但 Android 4.3 及更低版本的前台服务除外。如果您有相反的证据,您可以发布链接吗?
  • 这里:android.stackexchange.com/questions/19987/… 并且该主题包含原始问题的答案
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多