Service是一个可以在后台运行,不提供用户界面的组件。
两种形式:
启动
应用组件(如activity)通过调用startService()启动服务。该方法启动后的service即可在后台无限期的运行,及时启动它的组件被销毁也不受影响。启动的服务通常是执行单一的操作,并且不会将结果返回给调用方。
context.startService()-->onCreat()-->onStartCommand()-->Service running-->调用context.stopService(),或者stopSelf()-->onDestory()
绑定
应用组件通过调用bindService()绑定服务。该方法提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至利用进程间通信(IPC)跨进程执行这些操作。这种服务只有在另一个组件绑定时,才会运行。多个组件可以同时绑定到该服务,但全部取消绑定后,该服务才会被销毁。
context.bindService()-->onCreat()-->onBind()-->Service running-->调用unBind()-->onDestory()
注意:
服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另指定),如果服务想要执行CPU耗时操作,则应在服务内创建新线程完成这些工作,避免ANR
onStartCommand()方法返回值必须是以下常量:
START_NOT_STICKY:如果系统在onStartCommand()返回终止服务,除非有挂起Intent要传递,否则系统不会重建服务,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务。
START_STICKY:如果系统在onStartCommand()返回终止服务,则会重建服务并调用onStartCommand(),但不会重新传递最后一个Intent。相反,除非有挂起Intent要启动服务(在这种情况下,将传递这些Intent),否则系统会通过空Intent调用onStartCommand()。这适用于不执行命令,但无限期运行并等待作业如媒体播放器或类似服务。
START_REDELIVER_INTENT:如果系统在onStartCommand()返回后终止服务,则会重建服务,并通过传递给服务的最后一个Intent调用onStartCommand()。适用于主动执行应该立即恢复的作业如下载文件或类似服务。