绑定到onCreate()或onResume()中的服务

时间:2010-02-20 22:58:00

标签: android

我想知道Activity绑定到服务的最佳位置是什么? 我在onResume()onCreate()中看到了示例。我问自己,将它放入onCreate()是不是一个问题,因为在onPause()我会对服务进行解除绑定,所以如果我离开活动,我就不会得到serviceConnectionLeak。现在,如果我按下主页按钮然后切换到主屏幕,活动将从服务解除绑定,当我从任务管理器返回活动时,将不会调用onCreate(),如果代码是试图从服务访问一个函数我将得到一个NullPointerException。如果我仅在onResume()onPause()中绑定和解除绑定,我就没有这个问题。我是对的吗?

2 个答案:

答案 0 :(得分:45)

我通常建议您在onCreate() / onDestroy()onStart() / onStop()中执行此操作,具体取决于您需要的语义:

  • 如果您的Activity想要在Service整个正在运行的时间内与onCreate()进行交互(例如,它可能会为您从网络中检索一些数据,并会在以后返回数据准备就绪,你想在后台允许这种情况发生,所以如果用户返回你就会准备好数据),那么onDestroy() / Activity可能是合适的。请注意,这里的语义是Service运行它的整个时间需要Service,所以如果这个Activity在另一个进程中运行,那么你增加了它的重量并制作了它更有可能在后台被杀死。

  • 如果您的Service仅对onStart()可见时感兴趣,那么onStop() / Activity是合适的。这意味着当用户离开时ServiceonResume()取消绑定(并且不再可见),并在下次返回时重新连接并重新启动并恢复。

我通常不建议在onPause()Service中进行绑定/取消绑定。这些通常不会显着降低您使用Activity的数量(从而降低您的开销),事实上,因为在每次活动转换时都会发生暂停和恢复,这是您希望保持轻量级的代码路径尽可能。在此处执行此操作可能会产生其他意外的负面后果:例如,如果您应用中的多个Service绑定到同一个Service,则当其中两个活动之间存在转换时,Activity可能会在下一个恢复之前,当前onCreate()暂停时,也会被销毁并重新创建。

这些对(onDestroy() / onStart()onStop() / onPause()onResume() / Service)也是合适的对获取然后释放资源(例如绑定到{{1}},注册接收者等)以确保在需要之前正确获取它们并在不再需要时释放(而不是泄露)。

答案 1 :(得分:0)

你说的是对的。在大多数情况下,您需要在onResume()中注册并在onPause()中取消注册。如果您使用onCreate()并且onDestroy(),您仍然会在暂停时注册更新,这是一个糟糕的公民。如果您在onCreate()注册并在onPause()取消注册,当您恢复任务时,注册将会消失,这几乎肯定不是您想要的。