一、什么是Service?
Service是Android四大组键之一,是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(Context)里面,这取决于自身的需要。其它的组件可以绑定到一个服务(Service)上面,通过远程过程调用(RPC)来调用这个方法。
举个例子:
例如媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐依然可以继续播放,这时就是由服务(service)来保证当用户界面关闭时音乐继续播放的。
二、如何使用Service
1,创建一个MyService类并且继承与Service类,并且实现onBind()方法
2,在AndroidManifest.xml中注册Service
<service android:name="com.lsn.MyService">
3,通过Context启动Service
//第一种使用StartService的方式 参数是一个指向服务的意图
startService(Intent service);
生命周期:context.startService() -> onCreate() -> onStart() -> Service running -> context.stopService() -> onDestroy() -> Service stop
//第二种使用绑定的方式
bindService();
生命周期:context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Service stop
- Service已经启动之后,调用bindService()时候,则执行onCreate()方法;如果调用unBindService()时候,则执行onUnbind()方法
- 只有调用startService,才会执行onStart()方法;startService()之后,只有点击stopService(),调用onDestory()方法(调用unbind()方法并不能关闭程序)
4,关闭Service
//通过context关闭
context.stopService()
如果使用 bindService() 方法启动的,Context退出了,Srevice就会调用onUnbind()->onDestroy()相应退出。
使用unBindService()方法也可关闭Service,执行onDestroy()方法
三、onStartCommand()的返回值
- START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。