捆绑一个Service,你需要注意以下几个点:
1.你应该去捕捉DeadObjectException,这个异常通常会在连接断开时抛出。
2.对象是整个进程计数的引用。
3.在进程的生命周期中,你应该配对使用绑定和解绑。比如:
如果你只是在activity可见的情况下与Service进行交互,那么你应该在onStart()函数里进行绑定并在onStop()函数里进行解绑。
如果你是想在你的activity里收到来自Service的回应[甚至在你的activity 被迫停止后进入后台运行时],那么你应该在onCreate()函数内进行绑定,并在onDestroy()函数内进行解绑。请注意,这意味着你的activity在整个生命周期里都在使用这个Service,如果这个Service是在其他进程内运行,那么你会加重这个进程的负载,并且这会导致系统Kill它以便回收资源。
注意:不要在activity的onResume()和onPause()函数中对Service进行捆绑以及解绑操作,因为这些回调函数会在生命周期里的任何过渡中出现,但你应该保持进程的过渡时间及其短暂。另外,如果一个应用中有多个activity绑定了同一个service并且在这些activity的两个中存在过渡,那么这个service可能会在activity被stop时被销毁,并在下一个activity resume时重建。
绑定Service的生命周期的管理
当一个Service不被任何用户[指的是activity、service、content provider]绑定时,安卓系统会销毁它[除非它是在onStartCommand()函数内被启动].因此,你不必要亲自去管理Service的生命周期。安卓系统会替你去管理它。
但是,如果你选择了实现onStartCommand()的回调函数,那么你就必须主动显性地去给它解绑。不然它会随时启动。在这种情况下,这个Service会活动至它以stopSelf()方式自杀或者是其他组件调用stopService()函数,不管它是否被用户所绑定。
此外,如果你的Service已经启动,并且接受绑定,那么,当系统调用你的onUnbind()方法时,如果你即将回调onRebind()方法你,那么需要选择性地返回true。onRebind()方法返回一个void,但是用户仍然可以在它回调onServiceConnected()接受IBinder对象。下表展示了Service的生命周期。