0

我有一个关于服务的一般性问题。假设我有一项服务可以做到这一点:

private void finishCountdown() {
    playFinishSound();
    broadcastFinishedEvent();
    logFinishedEventToDatabase();
    stopSelf(); // has to stop itself because it's a started service,
                // and may need to run again immediately.
}

调用是否stopSelf()总是要等到前面的语句完成它们正在做的事情?它是否必须等待,或者只是使这些调用足以确保它们完成,而不管服务发生什么?我的应用程序发生了一些奇怪的事情(“一个 SQLiteConnection 对象被泄露了!”,声音有时会被切断并说“媒体播放器在发布之前完成”等),我想知道这是否是原因。

如果这是我不应该做的事情,那么让所有这些事情(广播、播放声音、写入数据库)由服务启动(应该尽快停止)的最佳方式是什么?如果我调用另一个服务来做这件事然后销毁原始服务,我如何确保另一个服务等到所有这些事情都完成后再停止自己?

4

1 回答 1

0

localService的生命周期与Intent正在处理的 s 和绑定到它的其他对象相关联。它是在Intent接收到一个或一个对象绑定到它时创建的。如果没有更多的绑定对象并且没有Intent要处理的 s,则将其销毁。它将Intent按照收到的顺序处理 s。您无需调用stopSelf()(或以任何其他方式停止)发送另一个Intent. 它将在主线程上运行,因此您不必担心Intent同时处理连续的 s。

如果您的数据库是设备上的 Sqlite 数据库,则可能无需担心其他问题。这些调用应该是同步的,所以不要调用stopSelf().

如果您的数据库是远程的并且正在进行异步调用,您可能希望通过使用某种队列来确保这些调用按顺序发送。

编辑:

我不完全理解为什么您的应用程序需要Service明确停止,但我不会担心。您提到的警告看起来好像没有正确清理。

我猜你正在回调release()中调用MediaPlayer对象。onCompletion如果没有,你可能应该是。异步执行操作,因此从您的方法MediaPlayer返回后不会立即完成。在拨打电话并已拨打电话之前,playFinishSound()您不应该拨打电话。stopSelf()ServiceonCompletionrelease()

SQLite 问题可能有点不同。我必须查看您的代码才能再说什么,但这也许有所帮助。

于 2013-10-10T03:53:55.030 回答