1 startService()
手动调用context.startService:onCreate()——onStartCommand()(service running)
手动调用context.stopService:onDestroy()
注意:(1) service被startService启动多次,onCreate()只会执行一次;所以,stopService()也只会调用一次。
(2) 如果已经onCreate(),那么startService()将只调用startCommand(),onStartCommand()调用次数=startService()调用次数。
(3) service可以无限运行下去,必须调用stopSelf()或其它组件调用stopService()停止。
2 bindService()
手动调用context.bindService():onCreate()——onBind()(service running)
手动调用context.unbindService(): onUnbind()——onDestroy()
注意:(1) 多次调用bindService()方法,创建服务onCreate()只会调用一次;onBind()只会调用一次。
(2) 客户端client可以通过IBinder接口获取Service实例,从而可以实现在client端直接调用Service中的方法以实现灵活的交互,并且可借助IBinder实现跨进程的client-server的交互,在startService启动的Service中是无法实现的。
(3) 调用Context.unbindService() 断开连接;或调用bindService() 的 Context 不存在了(比如Activity被finish),系统将会自动停止service,对应onDestroy将被调用。
(4) 一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
3 startService()+bindService()
一个已经调用startService()而被开启的service,也可以调用bindService进行绑定。
手动调用context.startService:onCreate()——onStartCommand()(service running)
手动调用context.bindService():onCreate()——onBind()
手动调用context.unbindService(): onUnbind()
手动调用context.stopService:onDestroy()
注意:(1) startService()和stopService()只能开启和关闭service,无法操作service;bindService()和unbindService()可以操作service。
(2) startService()开启service,调用者退出后service仍然存在;bindService()开启service,调用者退出后,随着调用者销毁。
(3) 调用了startService()和bindService(),要停止service,则需要调用stopService()或stopSelf(),并且所有的客户解除绑定;所以单独调用unbindService()也不会停止service。
onCreate()
首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前);如果服务已在运行,则不会调用此方法。可以在onCreate方法中完成一些Service初始化相关的操作。
onStartCommand()
当另一个组件通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 实现此方法,则在服务工作完成后,需要通过调用 stopSelf() 或 stopService() 来停止服务。如果多次执行了Context的startService方法,那么Service的onStartCommand方法也会相应的多次调用。onStartCommand方法很重要,在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。
onStartComand返回的是一个(int)整型,这个整型有四个返回值,它们的含义分别是:
(1) START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
(2) START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
(3) START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
(4) START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
onBind()
调用bindService()绑定服务后,将会执行该方法。Service中的onBind方法是抽象方法,所以Service类本身就是抽象类,也就是onBind方法是必须重写的,即使我们用不到。在此方法的实现中,必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信;如果并不希望允许绑定,则应返回 null。
onUnbind()
当所有绑定的客户端解除绑定时,系统将会调用该方法。
onDestory()
当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源。 当组件需要停止一个启动服务时,需要调用stopService();解除绑定服务时,需要调用unbindService()。