我想知道Activity绑定到服务的最佳位置是什么?
我在onResume()
和onCreate()
中看到了示例。我问自己,将它放入onCreate()
是不是一个问题,因为在onPause()
我会对服务进行解除绑定,所以如果我离开活动,我就不会得到serviceConnectionLeak。现在,如果我按下主页按钮然后切换到主屏幕,活动将从服务解除绑定,当我从任务管理器返回活动时,将不会调用onCreate()
,如果代码是试图从服务访问一个函数我将得到一个NullPointerException。如果我仅在onResume()
和onPause()
中绑定和解除绑定,我就没有这个问题。我是对的吗?
答案 0 :(得分:45)
我通常建议您在onCreate()
/ onDestroy()
或onStart()
/ onStop()
中执行此操作,具体取决于您需要的语义:
如果您的Activity
想要在Service
整个正在运行的时间内与onCreate()
进行交互(例如,它可能会为您从网络中检索一些数据,并会在以后返回数据准备就绪,你想在后台允许这种情况发生,所以如果用户返回你就会准备好数据),那么onDestroy()
/ Activity
可能是合适的。请注意,这里的语义是Service
运行它的整个时间需要Service
,所以如果这个Activity
在另一个进程中运行,那么你增加了它的重量并制作了它更有可能在后台被杀死。
如果您的Service
仅对onStart()
可见时感兴趣,那么onStop()
/ Activity
是合适的。这意味着当用户离开时Service
将onResume()
取消绑定(并且不再可见),并在下次返回时重新连接并重新启动并恢复。
我通常不建议在onPause()
和Service
中进行绑定/取消绑定。这些通常不会显着降低您使用Activity
的数量(从而降低您的开销),事实上,因为在每次活动转换时都会发生暂停和恢复,这是您希望保持轻量级的代码路径尽可能。在此处执行此操作可能会产生其他意外的负面后果:例如,如果您应用中的多个Service
绑定到同一个Service
,则当其中两个活动之间存在转换时,Activity
可能会在下一个恢复之前,当前onCreate()
暂停时,也会被销毁并重新创建。
这些对(onDestroy()
/ onStart()
,onStop()
/ onPause()
,onResume()
/ Service
)也是合适的对获取然后释放资源(例如绑定到{{1}},注册接收者等)以确保在需要之前正确获取它们并在不再需要时释放(而不是泄露)。
答案 1 :(得分:0)
你说的是对的。在大多数情况下,您需要在onResume()
中注册并在onPause()
中取消注册。如果您使用onCreate()
并且onDestroy()
,您仍然会在暂停时注册更新,这是一个糟糕的公民。如果您在onCreate()
注册并在onPause()
取消注册,当您恢复任务时,注册将会消失,这几乎肯定不是您想要的。