【问题标题】:Android - services doing things right before they stop themselvesAndroid - 服务在停止自己之前做事
【发布时间】: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


【解决方案1】:

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

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

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

编辑:

我不完全理解为什么您的应用需要明确停止 Service,但我不会担心。您提到的警告似乎没有得到适当的清理。

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

SQLite 问题可能有点不同。我必须查看您的代码才能说更多内容,但也许 this 会有所帮助。

【讨论】:

  • 不调用stopSelf() 完全搞砸了我的应用程序,因为它依赖于不再运行的服务......再次,原因太复杂,无法在这里解释......所以它需要停止一旦计时器达到零。
猜你喜欢
  • 2016-04-26
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2013-08-20
  • 1970-01-01
  • 2014-06-22
相关资源
最近更新 更多