Android服务:onBind(Intent)和onUnbind(Intent)只调用一次

Dmi*_*ank 41 service binding android

我有活动和服务.当Activity启动时,startService()即使Activity被销毁,它也会调用以使此服务处于活动状态,并bindService()与此服务进行通信.

bindService()返回true,mService.onBind()被调用,也ServiceConnection.onServiceConnected()被调用.一切都有效.

当我通过按Back键销毁我的Activity时,它会调用unbindService(),然后调用我的Activity mService.onUnbind().(我回来falseonUnbind().)

然后我重新开始这个活动,bindService()返回true,然后mService.onBind()叫!但也ServiceConnection.onServiceConnected()被召唤,一切都有效.

看起来Dalvik记得我onBind()上一次回​​来了什么,只是不再打电话onBind().当我再次破坏我的活动时,onUnbind()不会被召唤.

我可以多次绑定和取消绑定此服务到我的Activity,但是在我通过解除绑定和调用来销毁Service之前,不会再调用这些方法stopService().

在文档中,我无法找到对此行为的任何解释.相反,这个数字表明,onBind()onUnbind()应该叫每个客户绑定时间和取消绑定服务.此图可以在本开发指南的底部找到.

yor*_*rkw 54

我认为(从官方开发指南中引用)可以解释您的所有查询:

多个客户端可以立即连接到该服务.但是,只有在第一个客户端绑定时,系统才会调用服务的onBind()方法来检索IBinder.然后,系统将相同的IBinder传递给任何其他绑定的客户端,而无需再次调用onBind().

  • 哦谢谢.不幸的是,我错过了这个.但是,我发现我可以在`onUnbind()`中返回true,然后将为下一个客户端调用`onRebind()`和`onUnbind()`. (25认同)
  • 文档实际上是误导性的.它表示不再调用`onBind()`,但这仅适用于多个客户端的情况.文档还说"如果您的服务已启动并接受绑定,那么当系统调用您的onUnbind()方法时,如果您希望在客户端下次绑定到onRebind()时接收对onRebind()的调用,则可以选择返回true.服务(**而不是接收对onBind的调用()**)".只有没有调用`onBind()`.文档错误的另一种情况. (20认同)