【问题标题】:Android Service: onBind(Intent) and onUnbind(Intent) is called just onceAndroid 服务:onBind(Intent) 和 onUnbind(Intent) 只调用一次
【发布时间】:2012-02-05 23:15:33
【问题描述】:

我有活动和服务。 Activity启动时,调用startService()使该Service在Activity被销毁的情况下仍然存活,并调用bindService()与该Service通信。

bindService() 返回 true,mService.onBind() 被调用,ServiceConnection.onServiceConnected() 也被调用。所有作品。

当我按返回键销毁我的活动时,它会调用unbindService(),而我的mService.onUnbind() 会被调用。 (我在这个onUnbind() 中返回false。)

然后我再次启动这个 Activity,bindService() 返回 true,然后 mService.onBind()NOT 调用!但是ServiceConnection.onServiceConnected() 也被调用了,一切都恢复正常了。

Dalvik 似乎记得我上次返回的onBind(),只是不再调用onBind()。当我再次销毁我的 Activity 时,onUnbind() 也被 NOT 调用。

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

在文档中我找不到这种行为的任何解释。相反,this figure 表明每次客户端绑定和取消绑定服务时都应该调用 onBind()onUnbind()。这个图可以在this Dev Guide底部找到。

【问题讨论】:

    标签: android binding service


    【解决方案1】:

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

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

    【讨论】:

    • 哦,谢谢。不幸的是,我错过了这个。但是,我发现我可以在onUnbind() 中返回true,然后会为下一个客户调用onRebind()onUnbind()
    • 文档实际上具有误导性。它表示不再调用onBind(),但这仅适用于多个客户端的情况。文档还说“如果您的服务已启动并接受绑定,那么当系统调用您的 onUnbind() 方法时,如果您希望下次客户端绑定到服务(而不是接收对 onBind() 的调用)”。只有onBind() 没有电话。文档错误的另一种情况。
    • 抱歉碰到@Malcolm...我有一个关于绑定和取消绑定的问题。如果我在该服务中放置一个 ServerSocket 线程,并且在 Activity-A 中我放置 onStart() 和 onStop() 并相应地绑定和取消绑定,那会怎么样。如果我移动到另一个活动并再次绑定它,它会被重新创建吗?还是线程仍然是最后一个?
    • @gumuruh 很抱歉花时间回答。根据Android documentation on services,如果使用onStartonStop进行绑定和解绑,服务不会重新创建。也许您应该为此打开一个单独的问题(当然,如果还不存在的话)。
    • 另外需要注意的是:onBind() 被多次调用,以防客户端在调用bindService() 时使用不同的action 发送 Intent。不过,不同的extras 似乎并不重要。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以解除所有客户端的绑定,然后服务会被销毁,然后onBind会被调用,如果这是你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多