泄露服务连接是什么意思?

20

我正在为我的Android应用编写一个服务,我正在尝试了解绑定机制的工作原理。 如果我在活动的onCreate方法中绑定服务,但我没有在onStop或onDestroy方法中解除绑定,我就会遇到以下错误:

android.app.ServiceConnectionLeaked: Service com.google.ipc.invalidation.ticl.android.AndroidInvalidationService has leaked ServiceConnection com.googl
                              e.ipc.invalidation.external.client.android.service.ServiceBinder$1@4177f8f8 that was originally bound here
所以我的问题是:泄露连接的问题究竟是什么,通过解除服务绑定我能防止什么?
3个回答

48
通常情况下,您的应用程序是唯一可以访问您的服务(或使用它)的应用程序。如果关闭您的应用程序而该服务仍在运行,则该服务将不再有用。它会占用内存资源,但不执行任何操作。当您完成后通过取消绑定或停止服务,您会释放这些资源,使其他应用程序可以使用它们。
想象一个孩子把他们的玩具散布在房间里然后离开。房子里的其他人(父母、兄弟姐妹和客人)都没有用处,必须围着玩具走路。这些玩具只是碍事的东西。如果孩子把它们收起来,那么任何人都可以使用房间做任何他们想做的事情。
希望这有所帮助!

9
+1!这是关于该主题最有帮助的答案之一,尤其是由于给出的“绝妙”比喻! - Swayam
但是如果我想在执行其他活动的时候让服务保持运行呢?我已经在我的服务中使用了 START_STICKY 实现了这一点,但是如果我取消绑定服务,它就会停止运行。(它正在从一个 BLE 设备下载数据) - JourneyWithAndroid
实际上,当您的应用程序进程终止时,与绑定服务的连接将自动清除。 Binder 是以这种方式设计的,以防止资源泄漏,因为 Android 可以在没有处于启动状态的 Activity 时随时杀死您的应用程序(可能不会调用 onDestroy())。 - E.M.

41

当Android OS销毁Activity并发现一个ServiceConnection仍然绑定到正在运行的Service时,就会发生这种情况,因此您需要在销毁Activity之前取消服务的绑定。


1
澄清一下:系统使用绑定系统来判断服务是否仍在使用。如果没有调用startService,这尤其重要,因为在这种情况下,是框架将其杀死,因此当活动被销毁时不解除服务的绑定会阻止系统有效地执行此操作。 - Teovald

4

即使活动关闭后,服务仍在运行。因此,您需要在 onStop 或 onDestroy 中解除资源的绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接