我们做几个实验:
1,启动service
后,按back键返回。
一开始我没在service
中用子线程来调用方法,结果导致点击屏幕没有响应,但是菜单按钮和会主界面的
按钮可以按,因为,service
还是运行在主线程中的,后面我用子线程调用方法,测试的结果是:
用startService()
启动之后,按back
键,activity
被destroy,但是service
继续在运行,也就是说,当activity
被销毁后,主线程并没有被销毁,并且程序运行完后,service
也没有destroy。而用bindService()
启动之后,按back键,activity
被销毁,然后onUnbindService
,然后ServiceDestroy
,但是程序还是一直
运行,也就是说bindServic
e和activity
是绑定的,当activity
消亡时,这个service也消亡。同时这里得提一下,
当这个service
消亡时,是只运行service
中的onUnbind()
方法,不会去运行activity
中的onServiceDisconnected()
方法。
2,分别多次按startService
按钮和BoundService
按钮,看看情况
结果是startService
按钮是第一次创建service
后,后面每次按都不会再创建,但是都会执行onStartCommand()
方法,
而对于bindService而言,按一次之后再按不会有变化,但是如果将conn
这个变量在BoundService
按钮的
方法体中再次赋值(之前是在onCreate中赋值),那么结果就不同,当按下一次后再按,结果就会再次执行,再按,再执行,
当然如果你调用的方法的执行需要时间,比如打印1-100的数,那么两次结果会穿插输出,而当你按unBound按钮时,就会发现
当你按一次时,它不会调用service
中的onUnbind()方法,service
也不会被destroy,但是再按一次就会报错,内容大概是service
没有registered(发生这种情况的原因是这里的conn会跟最后一个按BoundService按钮时候生成的conn一致。)。这与按一次BoundService按钮,再按一次unBoundService按钮结果不
同,这时按unBoundService的结果是会调用service
中的onUnbind()
方法,service
也会被destroy
。为什么多按几次BoundButton再按一次unBoundButton不会调用service中的onUnbind()方法,service
也不会被destroy
呢?但是这个service
应该是被unBind的了的,不然的话第二次按的话为什么会出现这个service
没有registered的错误呢,那么如何被onunBind的呢?而后,我想到
将所产生的conn全部存储起来,然后分别当作参数传递给activity
中的unbindService(conn)
方法,
于是我将点击bindButton按钮产生的所有ServiceConnection
的对象全都存储到一个ServiceConnnection
的数组中,然后在unBindButton中将数组的值分别赋值给conn,这样的话当你点击bindButton
产生多个ServiceConnection
对象后,点击unBindButton按钮就会依次解除绑定,当你解除最后一个service时,就会调用onUnbind
和destroy
方法,也就是说,其实onUnbind
方法是等所有的service
解除绑定后才调用,所以之前只解除一个service
时并没有调用这个方法,也就没有destroy
,因为这个service
和activity
还是处在绑定的状态。