Service是一个应用程序组件,可以用来处理一些比较耗时的操作.
•A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.
Service不是一个单独的进程.
• A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).
Service不是一个线程.
启动方法
1.Content.startService()
此启动方式,不会与绑定者没有关系,即使程序退出,servcie仍然运行着.
2.Content.bindService()
bindService会与绑定者销毁,即程序退出,service就立即停止.
二、第一种方式调用startService启动服务:
1、当服务未启动,如果调用startService第一次启动服务会回调方法顺序为:onCreate -> onStart
2、当服务已启动,如果调用startSerivce启动服务只会回调方法为:onStart
3、当服务已启动,如果外部组件调用stopSerivce或内部调用stopSelf或stopSelfResult关闭服务会回调方法为:onDestroy
说明:这种服务不会因为服务创建者销毁而销毁,可能会因为系统内存紧张时被系统强制销毁(可以改变Serivice优先级延长它被销毁的时间)。无论启动多少次服务,只需要调用一次关闭服务就可以关闭服务。
三、第二种方式调用bindService绑定服务:
1、当服务未启动,如果调用bindService第一次绑定服务会回调方法顺序为:onCreate -> onBind -> onServiceConnected
2、当服务已启动,如果服务创建者再次调用bindSerivice不会回调任何方法,而非服务创建者调用bindService第一次绑定服务只会回调方法为:onServiceConnected
3、当服务已启动,如果非服务创建者调用unbindService会解除与之服务的绑定,但不会回调任何方法。而服务创建者调用unbindService会回调方法顺序为:onUnbind ->onDestroy
说明:这种服务会因为服务创建者的销毁而销毁,而且会回调方法顺序为:onUnbind -> onDestroy。无论非服务创建者调用多少次unbindService解除绑定,都不会关闭服务(解除自身与服务的绑定关系)。而只有服务创建者自己调用unbindService才会关闭服务。
注意:如果退出程序时使用System.exit(0)或者Process.killProcess(Process.myPid())方式完全退出,那么以调用startService启动服务的服务会中断然后再重启,以至于会回调方法顺序为:onCreate -> onStart。
PS:两种方式启动服务的区别:通过startService()和stopService()启动关闭服务。适用于服务和访问者之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,侧需要使用bindService()和unbindService()方法启动关闭服务。
采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起。
如果访问者要与服务进行通信,那么,onBind()方法必须返回Ibinder对象。如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。
4、停止一个service
一个"启动的"service必须管理其自己的生命期.这表示,系统不会停止或销毁这种service,除非内存不够用了并且service在onStartCommand()返回后会继续运行.所以,service必须调用stopSelf()停止自己或由另一个组件调用stopService()来停止它.
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
2、 当采用Context.bindService()方法启动服务,与之有关的生命周期方法
onCreate()--> onBind() --> onUnbind() --> onDestroy()
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate()-->onStart()-->onBind()-->onUnbind()[重载后的方法需返回true-->onRebind()
下面这张流程图很好的诠释了"startService()"和"bindService()"两个方法调用的生命周期。
PS:
1、应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder.
2、绑定是异步的.bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService().ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder.
3、从你的客户端绑定到一个service,你必须:
1)实现ServiceConnection.
你的实现必须重写两个回调方法:
onServiceConnected()
系统调用这个来传送在service的onBind()中返回的IBinder.
OnServiceDisconnected()
Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
2)调用bindService(),传给它ServiceConnection的实现.
3)当系统调用你的onServiceConnected()方法时,你就可以使用接口定义的方法们开始调用service了.
4、使用这个ServiceConnection,客户端可以绑定到一个service,通过把它传给bindService().例如:
Intentintent = new Intent(this, LocalService.class);
bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
第一个bindService()的参数是一个明确指定了要绑定的service的Intent.
第二个参数是ServiceConnection对象.
第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定时设为0即可