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

时间:2012-01-09 12:00:58

标签: android binding service

我有活动和服务。当Activity启动时,它会调用startService()以使该服务在活动被销毁时保持活动状态,并bindService()与此服务进行通信。

bindService()返回true,调用mService.onBind(),同时调用ServiceConnection.onServiceConnected()。一切都有效。

当我通过按返回键销毁我的活动时,它会调用unbindService(),并调用我的mService.onUnbind()。 (我在此false中返回onUnbind()。)

然后我再次启动此活动,bindService()返回true,然后mService.onBind() NOT 被调用!但ServiceConnection.onServiceConnected()也被调用,而且一切都有效。

看起来Dalvik记得我onBind()上次返回的内容,并且没有再次致电onBind()。当我再次销毁我的活动时,onUnbind() NOT 也被调用。

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

在docs中,我无法找到对此行为的任何解释。相反,this figure表示每次客户端绑定和取消绑定服务时都应调用onBind()onUnbind()。这个数字可以在this Dev Guide的底部找到。

2 个答案:

答案 0 :(得分:53)

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

  

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

答案 1 :(得分:0)

你可以在这里找到它: https://developer.android.com/guide/components/bound-services.html

您可以同时将多个客户端连接到服务。但是,系统缓存IBinder服务通信信道。换句话说,只有当第一个客户端绑定时,系统才会调用服务的onBind()方法来生成IBinder。然后系统将相同的IBinder传递给绑定到同一服务的所有其他客户端,而无需再次调用onBind()。