一、服务的概念
服务(Service)是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面。即使用户切到另一应用程序,服务仍可以在后台运行。
Service是能够在后台执行长时间运行操作并且不提供用户界面的应用程序组件。
其它一个应用程序组件能启动Service;
即便用户切换到另一应用程序,之前启动的服务还可以在后台运行。
服务能在后台处理网络事物、播放音乐、下载文件、与ContentProvider通信等。
1、Service分类
Started(启动)
当应用程序组件(例如Activity)通过调用startService()方法启动服务时,服务处于started状态。一旦启动,服务能在后台无限期运行,即使启动它的组件已经被销毁。通常,启动服务执行单个操作并且不会向调用者返回结果。
Bound(绑定)
当应用程序组件通过调用bindService()方法绑定到服务时,服务处于bound状态。绑定服务提供客户端-服务器接口以允许组件与服务交互、发送请求、获得结果、甚至使用进程间通信(IPC)跨进程完成这些操作。仅当其他应用程序组件与之绑定时,绑定服务才运行。多个组件可以一次绑定到一个服务上,但是当它们都解绑定时,服务被销毁。
2. Service生命周期
Started Service
当其他组件调用startService()方法时,服务被创建。接着服务无限期运行,其自身必须调用stopSelf()方法或者其他组件调用stopService()方法来停止服务。当服务停止时,系统将其销毁。
Bound Service
当其他组件调用bindService()方法时,服务被创建。接着客户端通过IBinder接口与服务通信。客户端通过unbindService()方法关闭连接。多个客户端能绑定到同一个服务并且当它们都解绑定时,系统销毁服务(服务不需要被停止)。

onCreate:创建Service,第一次创建Service的时候调用一次,以后均不会再次调用;
onStartCommand: 在其它组件执行了startService方法请求启动服务时回调该方法,之后系统处于started状态;
onBind: 其它组件使用bindService方法与Service绑定时回调该方法,onBind方法是抽象方法,所以Service类本身就是抽象类,也就是onBind方法是必须重写的,即使我们用不到。在通过startService使用Service时,我们在重写onBind方法时,只需要将其返回null即可。
onUnBind:使用unbindService()方法取消绑定Service时调用该方法;
onDestroy:在销毁的时候回调,通过startService方法启动的Service会无限期运行,只有当调用了Context的stopService或在Service内部调用stopSelf方法时,Service才会停止运行并销毁。使用bindService()绑定的服务在解除绑定时会被销毁。
二、服务的启动方式
1、start方式启动服务
使用startService()方式开启服务的具体代码如下所示:
Intent intent = new Intent(this, StartService.class);
Context.startService(intent);
Context.stopService(intent);
服务也是Android中的四大组件之一,因此需要在清单文件中注册
<service android:name = "cn.itcast.startservice.MyService"/>
2、bind方式启动服务
当程序使用startService()和stopService()启动、关闭服务时,服务与调用者之间基本不存在太多的关联,也无法与访问者进行通信、数据交互等。如果服务需要与调用者进行方法调用和数据交互时,应该使用bindService()和unbindService()启动、关闭服务。
bindService(Intent service,ServiceConnection conn, intflags)
Intent对象用于指定要启动的Service
ServiceConnection对象用于监听调用者与Service的连接状态。
flags指定绑定时是否自动创建Service(如果Service还未创建)。

