【发布时间】:2013-10-10 03:24:54
【问题描述】:
我有一个关于服务的一般性问题。假设我有一项服务可以做到这一点:
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 对象被泄露了!”,声音有时会被切断并说“媒体播放器在发布之前完成”等),我想知道这是否是原因。
如果这是我不应该做的事情,那么让所有这些事情(广播、播放声音、写入数据库)由服务启动(应该尽快停止)的最佳方式是什么?如果我调用另一个服务来做这件事,然后销毁原来的服务,我如何确保另一个服务等到所有这些事情都完成后再停止自己?
【问题讨论】:
-
您如何使用本服务?是本地的吗?如果是这样,你为什么觉得有必要停止它(因为它没有自己的线程并且没有其他应用程序可以访问它......)?另外,您调用的那些方法是同步的吗?我猜数据库调用不是,所以你应该等待它完成。
-
是的,这是一项本地服务,我需要立即停止它,因为它可能必须立即再次运行(原因太复杂无法解释)。至于同步方法,我不知道那是什么意思,但这听起来像是我应该学习的东西。但即使我不必立即停止服务,因为它是一个启动的服务,我必须在某个时候停止它,那么什么时候?
-
您是绑定到服务还是向其发送 Intent?
-
两者都是,它是从一个意图开始的,然后绑定为一个活动(倒数计时器)提供持续更新。所以即使activity解绑了,我还是要停止服务,而且由于在此期间activity可能会被销毁,所以我不能依赖它来停止服务。
-
您不需要 Intent 来启动服务。绑定会解决这个问题。解绑将允许它自我毁灭。如果不是 Activity,你从哪里绑定?
标签: android