1、服务
Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。
服务基本上分为两种形式:
(1)启动:应用组件通过调用 startService() 启动服务(这会导致对 onStartCommand() 的调用),服务将一直运行,直到服务使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 停止它为止。
(2)绑定:应用组件通过调用 bindService() 来创建服务(并不会调用 onStartCommand()),服务即处于“绑定”状态,客户端通过IBinder接口与服务进行通信,客户端可以通过调用unbindService()关闭连接。服务只会在该组件与其绑定时运行。一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信(IPC)跨进程执行这些操作。
服务既可以是启动服务(以无限期运行),也允许绑定。只要分别实现服务的回调方法:onStartCommand()(允许组件启动服务)和 onBind()(允许绑定服务)。
默认情况下,服务会在应用的主线程中运行,因此,如果服务执行的是密集型或阻止性操作,则您仍应在服务内创建新线程,以降低发生ANR的风险。
2、Service常用方法
1)onCreate():首次创建服务时,系统将调用此方法来执行一次性设置程序。如果服务已在运行,则不会调用此方法。
2)onStartCommand():当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。该方法必须返回整型数,用于描述系统应该如何在服务终止的情况下继续运行服务,返回值必须是以下常量之一:
START_NOT_STICKY:如果系统在 onStartCommand()返回后终止服务,则除非有挂起 Intent 要传递,否则系统不会重建服务。这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务。
START_STICKY:如果系统在onStartCommand() 返回后终止服务,则会重建服务并调用 onStartCommand(),但不会重新传递最后一个 Intent。相反,除非有挂起 Intent 要启动服务(在这种情况下,将传递这些 Intent ),否则系统会通过空 Intent 调用 onStartCommand()。这适用于不执行命令、但无限期运行并等待作业的媒体播放器(或类似服务)。
START_REDELIVER_INTENT:如果系统在onStartCommand() 返回后终止服务,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand()。任何挂起 Intent 均依次传递。这适用于主动执行应该立即恢复的作业(例如下载文件)的服务。
3)onBind():当另一个组件想通过调用bindService()与服务绑定时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回null(默认实现)。
4)onDestroy():当服务不再使用且将被销毁时,系统将调用此方法。
3、创建启动服务
可以通过扩展两个类来创建启动服务:
(1) Service:适用于所有服务的基类。若要求服务执行多线程(而不是通过工作队列处理启动请求),则可扩展 Service 类来实现复杂的服务。扩展此类时,必须创建一个用于执行所有服务工作的新线程,因为默认情况下,服务将使用应用的主线程,这会降低应用正在运行的所有 Activity 的性能。
(2) IntentService:是Service 的子类,它使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,这是最好的选择。
IntentService已经实现的操作有:
IntentService会创建一个工作线程,在该工作线程中处理所有Intent;
创建工作队列(存放所有待处理的Intent);
在处理完所有启动请求后停止服务,因此您不必调用stopSelf();
提供onBind()的默认实现(返回 null);
提供onStartCommand()的默认实现,代码实现了将Intent依次发送到工作队列和 onHandleIntent()。
因此,您只需实现 onHandleIntent()方法即可,该方法会接收每个启动请求的Intent,使您能够执行后台工作。
4、创建绑定服务
如需与Activity和其他应用组件中的服务进行交互,或者需要通过进程间通信 (IPC)向其他应用公开某些应用功能,则应创建绑定服务。
通过扩展Service类,并实现onBind()回调方法,该方法返回的IBinder对象提供了客户端用来与服务进行交互的编程接口。
客户端可通过调用bindService()绑定到服务。调用时,客户端必须提供 ServiceConnection的实现,后者会监控与服务的连接。bindService()方法会立即无值返回,但当Android系统创建客户端与服务之间的连接时,会对 ServiceConnection调用onServiceConnected(),向客户端传递用来与服务通信的 IBinder。
多个客户端可同时连接到一个服务。不过,只有在第一个客户端绑定时,系统才会调用服务的onBind()方法来检索IBinder。系统随后无需再次调用onBind(),便可将同一IBinder传递至任何其他绑定的客户端。
可通过三种方法定义Ibinder接口:扩展 Binder 类、使用 Messenger、使用 AIDL。
5、服务生命周期
6、其他
1、服务运行后,可使用 Toast 通知或状态栏通知来通知用户所发生的事件。
2、前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。