1

在我的应用程序中,我有一个用于播放 MP3 流音乐的服务。我启动它(startService())并连接到它(bindService()),所以当没有客户端连接时它不会停止。如果播放器暂停,我会在一段时间后清理一些资源,如果它继续暂停一段时间,我会清理几乎所有资源,并且:如果没有连接客户端(连接活动),我停止调用 stopSelf() 的服务; 如果有一些客户端连接,我准备将其销毁,设置一个在所有客户端断开连接时检查的布尔值,如果没有连接客户端并且该布尔值为真,则调用 stopSelf()。

因此,基本上,只有在(1)没有客户端连接到它并且(2)它暂停很长时间时,服务才会被销毁。

它运行良好,但我有一个问题。在 onDestroy() 中,我释放所有资源并保存一些数据(例如正在播放的音乐列表)。如果有很多音乐,则可能需要将近半秒钟。问题是当我在这段时间内再次打开我的应用程序时,onDestroy() 还没有返回。发生的情况是使用了相同的服务实例并且未调用 onCreate()。所以,既然资源被释放了,我自然会得到一些错误。

这个错误很难模拟。我只能复制 3 次。我不知道该怎么做。我想尽快从 onDestroy() 返回,使用另一个线程释放资源并保存数据,但这会使新服务在数据保存之前启动。有人知道有关在 Android 上完成服务的销毁/重新创建方式的更多详细信息吗?我不知道哪个类管理它,所以我不知道我可以阅读哪些代码来更好地理解它。

提前致谢。

更新:

我刚刚发现了我真正的问题。当我的活动断开连接并重新连接时(当我关闭所有活动并再次打开应用程序时),似乎没有调用服务的 onBind。因此,我的资源清理器(即在播放器暂停时安排在一段时间后安排的计划作业)认为没有连接客户端并调用 stopSelf()(我使用 onBind 和 onUnbind 方法跟踪连接的客户端)。而且,即使有一个客户端连接到该服务,也会调用 onDestroy()。然后,我的 Activity 与刚刚清理所有资源的 Service 保持连接。

我也更新了问题的标题。

更新 2:

只是多一点解释。当我关闭并重新打开我的应用程序时,在 bindService 之后调用了我的 ServiceConnection 实现的 onServiceConnected 方法,但不调用 Service 的 onBind。似乎它真的认为没有连接客户端,因为即使文档说在所有客户端解除绑定之前不会破坏已启动和绑定的服务,它也会被破坏。

4

1 回答 1

3

我发现重新连接服务时没有调用我的 onBind。所以,我开始在 onUnbind 中返回“true”。这样,当 Activity 重新连接到 Service 时,就会调用 onRebind。然后,如果有任何客户端连接,我仍然会跟踪,如果没有客户端连接,我的资源清理器只会调用 stopSelf。

无论如何,我认为这是一个错误。文档告诉我,在所有客户端都断开连接并调用 stopService/stopSelf 之前,同时启动 (startService()) 和绑定 (bindService()) 的服务不会被销毁 (onDestroy())。所以,当我的资源清理器调用 stopSelf() 时,服务不应该被破坏,因为有一个客户端连接(当客户端重新连接时)。

于 2013-07-22T14:35:52.250 回答