Android:唯一客户端调用unbindService时onUnbind为何未执行?
我之前开发后台Service时也碰到过一模一样的问题,结合Android Service的绑定机制,大概率是下面这几个常见原因导致的:
绑定操作根本没成功
先检查你调用bindService()的返回值,如果返回false,说明Service没有被正确绑定,后续的unbindService()自然不会触发onUnbind()。这种情况通常是因为你的Service的onBind()方法返回了null,或者Service在AndroidManifest里没注册、权限配置不对。绑定和解绑的次数不匹配
你以为只有一个客户端连接,但可能代码里不小心重复调用了bindService()(比如在Activity的onResume()里每次都绑定一次),而你只调用了一次unbindService()。Android的Service绑定是计数制的,只有当所有绑定都被解绑(计数归0)时,onUnbind()才会执行。建议在onBind()和onUnbind()里加日志统计次数,看看是不是解绑次数不够。解绑用的Context和绑定的不一致
这个坑很容易踩:如果你用Activity的Context绑定的Service,却用Application的Context去解绑,或者反过来,解绑操作会无效,onUnbind()也不会触发。一定要确保bindService()和unbindService()调用的是同一个Context对象(比如都是当前Activity的this)。Service被系统提前销毁了
如果你的Service只是纯绑定型的(没有调用startService()启动它),当系统内存不足时,可能在你解绑之前就把Service回收了,这时候onUnbind()当然不会执行。因为你需要Service后台轮询数据,建议结合startService()和bindService():先调用startService()让Service进入后台存活状态,再绑定,这样即使解绑了,Service也不会立刻被销毁,还能继续执行轮询任务。绑定流程被异常打断
比如在onBind()方法里做了耗时操作、抛出了未捕获的异常,导致绑定流程没完全走完。可以在Service的onCreate()、onBind()、onDestroy()这些生命周期方法里都加上日志,追踪整个流程,看看是不是哪里出了异常导致绑定失败。
快速排查步骤
- 打印
bindService()的返回值,确认绑定是否成功; - 在Service的生命周期方法里加日志,统计绑定/解绑的次数;
- 检查绑定和解绑的Context是否为同一个实例;
- 确认是否结合了
startService()来维持Service的后台存活。
内容的提问来源于stack exchange,提问作者carpenma

