学一个东西我们一般要了解它有什么用,那么service
有什么用呢?service
简洁来说一般是用于处理耗时时间长,并且与activity
通讯不频繁的的任务,比如下载一部电影,但是如果你下载一个图片,并且希望当它下载后显示出来,那我们没有必要使用service
,我们可以使用线程。那么知道了service
的作用后,
它有多少种类型呢?对于这个,我们一般是跟分的方式有关,我们可以有三种方式的分法,首先,按照
启动方式分,我们可以分为startService
和bindService
两种,那么这两种有什么区别呢?对于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
时,就会调用
onUnbind
和destroy
方法,也就是说,其实onUnbind
方法是等所有的service解除绑定后才调用,所以之前只解除一个service
时并没有调用这个方法,也就没有destroy,因为这个service
和activity
还是处在绑定的状态。
第二种按照服务性质分为LocalService
和RemoteService
,对于android而言,RemoteService
其实就是不同进程。而对于
如何启动不同进程的service,我还不会。
第三种按照实现方式分为Java Service
和Native Service
两种,Native Service
是用C,C++实现的服务。