Service组件
长期运行在后台,且不提供用户界面。即使用户切换到其他应用,服务仍能在后台继续运行。
类型(不互斥,与实现的回调方法有关)
- 启动服务:start service,程序内部,执行单个操作,不与其它组件交互信息。通常在执行完操作后,服务会自动停止自身。 回调方法:
int onStartCommand(Intent intent, int flags, int startId),调用startService()时调用。 - 绑定服务:bind service,多程序之间,提供客户端-服务端接口,允许与其它组件和服务交换信息(发送请求、获取结果,甚至进行进程间通信 IPC)。多个组件可以绑定到同一个服务上,当所有绑定都解除后,服务即被销毁。 回调方法:
IBinder onBind(Intent intent),调用bindService()时执行。
其它回调方法
onCreate():首次创建服务时调用(在onStartCommand()或onBind()之前调用,如果服务已在运行则不会被调用)。onDestroy():服务不再使用且被销毁时调用。应在此方法中清理资源,如线程、已注册的监听器、接收器等。onUnbind():绑定的客户端全部解绑时调用。
生命周期

创建与注册
-
自定义继承
Service的类,重写onBind()方法(无论是绑定还是启动服务都要写) -
在AndroidManifest.xml文件中注册Service
在
节点中添加一个 <service android:name=".Service类名"/>标签。
启动与停止
- 在Activity中启动一个Service
- 在Activity中停止一个Service
绑定与解绑
- 在Activity中绑定一个Service
需要创建一个
ServiceConnection对象,用于监控与Service的连接状态(需重写onServiceConnected和onServiceDisconnected方法)。
- 在Activity中解绑一个Service
IntentService
Service默认运行在其托管进程的主线程中,它既不创建自己的线程,也不在单独的进程中运行。如果服务执行密集型或阻塞性操作,会导致ANR(应用程序无响应),因此必须在Service内创建新的线程来完成这些耗时工作。
一种简化的实现是使用IntentService,它是Service的子类。它每次都会使用一个新的工作线程来逐一处理全部启动请求(一次处理一个意图,不会阻塞主线程)。
实现要求:
- 提供一个空构造函数,并在内部调用
super("工作线程名称")。 - 重写
onHandleIntent(Intent intent)方法,在这里执行具体的后台耗时操作。 - 工作任务执行完毕后,IntentService会自动停止,开发者无需手动调用
stopSelf()。