service学习总结

来源:互联网 时间:2017-01-13

学一个东西我们一般要了解它有什么用,那么service有什么用呢?service简洁来说一般是用于处理耗时时间长,并且与activity通讯不频繁的的任务,比如下载一部电影,但是如果你下载一个图片,并且希望当它下载后显示出来,那我们没有必要使用service,我们可以使用线程。那么知道了service的作用后,
它有多少种类型呢?对于这个,我们一般是跟分的方式有关,我们可以有三种方式的分法,首先,按照
启动方式分,我们可以分为startServicebindService两种,那么这两种有什么区别呢?对于startService
而言,它不跟activity绑定,当activity退出时,它不会退出,并且用这种方式启动一个service,我们可以
对这个service下达多次的命令,因为当这个service创建后,我们再去点击startButton的按钮,你会发现
它不会重新创建一个service,但是会执行onstartCommand()方法,而对于bindService而言,它跟activity
是绑定的,如果activity退出,那么它就会onUnbind,然后destroy。而且,当你使用这个方式启动service
后,当你再点击,你会发现没有反应,这是因为当你使用一个ServiceConnection类型的参数让activity
service连接后,当你再使用这个类型的同一参数时,就不会再次进行连接,也就是说,如果你同时将ServiceConnection
类型的参数在bindButton中重新new一个,也就是说每次点击这个button都会重新创建一个serviceConnection
类型的参数,这时就会重新连接,重新调用ServiceConnection中的onServiceConnected()方法但是onbind()方法
不会再调用,因为第一次时就已经调用并且返回了一个Ibinder类型的接口,而这个接口的内容是不变的,
所以不再调用onBind()方法。而ServiceConnection类型的参数是跟最后一次点击BindButton时new的ServiceConnection
类型的参数一样,也就是说,在unBindButton中的unbindService(ServiceConnection类型的参数)方法中
传入的参数是最后一次的参数,当我们点击这个button时,会unbind这个service,但是再点击一次就会
报错,内容是这个service没有注册,只是第一次点击这个unBindbuttton时不会调用service中的onUnbind()方法,也没有destroy。
既然如此,第二次是如何出现service没有注册这个错误的呢?这一点搞不太懂。而后,我想到将所产生的conn全部存储起来,
然后分别当作参数传递给activity中的unbindService(conn)方法,
于是我将点击bindButton按钮产生的所有ServiceConnection的对象全都存储到一个
ServiceConnnection的数组中,然后在unBindButton中将数组的值分别赋值给conn,这样的话当你点击bindButton
产生多个ServiceConnection对象后,点击unBindButton按钮就会依次解除绑定,当你解除最后一个service时,就会调用
onUnbinddestroy方法,也就是说,其实onUnbind方法是等所有的service解除绑定后才调用,所以之前只解除一个service
时并没有调用这个方法,也就没有destroy,因为这个serviceactivity还是处在绑定的状态。


第二种按照服务性质分为LocalServiceRemoteService,对于android而言,RemoteService其实就是不同进程。而对于
如何启动不同进程的service,我还不会。
第三种按照实现方式分为Java ServiceNative Service两种,Native Service是用C,C++实现的服务。




相关阅读:
Top