在我的应用程序中,我有一个用于播放MP3流音乐的服务。 我启动它(startService())并连接到它(bindService()),所以当没有连接客户端时它不会停止。 如果播放器暂停,我会在一段时间后清理一些资源,如果它暂停一段时间,我会清理几乎所有的资源,并且:如果没有连接客户端(活动连接),我停止服务调用stopSelf() ;如果连接了一些客户端,我准备将其销毁,设置一个在所有客户端断开连接时检查的布尔值,如果没有客户端连接则调用stopSelf()并且此布尔值为真。
所以,基本上,只有在(1)没有连接到它的客户端和(2)它暂停了很长时间时才会销毁服务。
它运作良好,但我有一个问题。在onDestroy()中,我释放所有资源并保存一些数据(比如正在播放的音乐列表)。如果有很多音乐,可能需要将近半秒钟。问题是当我在这段时间内再次打开我的应用程序时,onDestroy()还没有返回。发生的是使用相同服务的实例并且不调用onCreate()。因此,由于资源已经发布,我自然会遇到一些错误。
这个bug很难模拟。我只能重现3次。我不知道该怎么办。我想尽可能快地从onDestroy()返回,使用另一个线程来释放资源并保存数据,但它会使新服务在数据保存之前启动。有人知道有关在Android上销毁/重新创建服务的方式的更多详细信息吗?我不知道哪个类管理它,所以我不知道我能阅读哪些代码来更好地理解它。
提前致谢。
更新:
我刚刚发现了我的真正问题。当我的活动断开连接并重新连接时(当我关闭所有活动并再次打开应用程序时),似乎没有调用服务的onBind。因此,我的资源清理程序(即在播放器暂停后安排一段时间的预定作业)认为没有连接客户端并调用stopSelf()(我使用onBind和onUnbind方法跟踪连接的客户端)。而且,即使客户端连接到该服务,也会调用onDestroy()。然后,我的Activity保持连接到刚清理完所有资源的服务。
我也更新了问题的标题。
更新2:
再多一点解释。当我关闭并重新打开我的应用程序时,在bindService之后调用我的ServiceConnection实现的onServiceConnected方法,但不调用服务的onBind。而且它似乎真的认为没有连接客户端,因为它被破坏,即使文档说在没有绑定所有客户端解除绑定之前也不会销毁启动和绑定服务。
答案 0 :(得分:3)
我发现在重新连接服务时我的onBind没有被调用。所以,我开始在onUnbind中返回'true'。这样,当Activity重新连接到服务时,将调用onRebind。然后,我仍然跟踪是否有任何客户端连接,如果没有连接客户端,我的资源清理器只调用stopSelf。
无论如何,我认为这是一个错误。文档告诉我,在所有客户端都断开连接并调用stopService / stopSelf之前,不会销毁(startService())和bound(bindService())的服务(onDestroy())。因此,当我的资源清理程序调用stopSelf()时,不应销毁该服务,因为已连接客户端(当客户端重新连接时)。