startService与BindService的区别

我们做几个实验:
1,启动service后,按back键返回。
一开始我没在service中用子线程来调用方法,结果导致点击屏幕没有响应,但是菜单按钮和会主界面的
按钮可以按,因为,service还是运行在主线程中的,后面我用子线程调用方法,测试的结果是:
startService()启动之后,按back键,activity被destroy,但是service继续在运行,也就是说,当
activity被销毁后,主线程并没有被销毁,并且程序运行完后,service也没有destroy。而用bindService()
启动之后,按back键,activity被销毁,然后onUnbindService,然后ServiceDestroy,但是程序还是一直
运行,也就是说bindService和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时,就会调用
onUnbinddestroy方法,也就是说,其实onUnbind方法是等所有的service解除绑定后才调用,所以之前只解除一个service
时并没有调用这个方法,也就没有destroy,因为这个serviceactivity还是处在绑定的状态。

你可能感兴趣的:(startService与BindService的区别)