最近学习Service,理论集合实际,动手写了一个ServiceDemo,由于前面2篇文章,我们对Service的使用场景以及为啥不用线程用Service有了一个初步了解后。我们就开始实战!
1.初步建立一个android工程,ui绘制4个按钮,分别对service的启动,绑定,停止,解绑做了研究。
2.分析原理
在Activity中第一次调用了Context.startService(...)方法会触发Service生命周期函数onCreate()、onStartCommand()、onStart(),当重复调用Context.startService(...)触发onStartCommand()、onStart(),但不再触发onCreate();Context.bindService()绑定服务会触发onBind(),多次绑定不触发任何方法;如果已经开启服务,再绑定服务,此时也不再触发onCreate()。
a)如果已经Context.startService(...),然后再Context.bindService() 还是先Context.bindService() 再Context.startService(...),此时已进入绑定服务闭环,此时调用stopService()是不触发Service中的onDestroy()方法,除非调用unbindService()才触发onDestroy();
b)单独的Context.startService(...)或绑定服务Context.bindService() ,对应都要通过stopService(),unbindService()来停止服务。
如果已经解绑了服务unbindService(),然后再点击解绑unbindService(),此时会报错IllegalArgumentException,为了解决这个问题,我在Activity定义了一个private boolean mIsBind;当bindService()时设置为true,然后解绑doUnbindService()时判断为true才执行。