关于Android Service真正的完全详解,你需要知道的一切
Service是Android中用于执行后台任务、没有UI的组件。运行在主线程(UI线程),适合做耗时任务、跨组件通信、常驻任务(需谨慎)。
Service有两种核心启动方式。
启动型
当应用组件(如Activity)通过startService(intent)方法启动服务,则属于启动型。特点是独立运行,与调用方无关,即使启动服务的组件被销毁也不受影响,不会将结果返回给调用方,通常通过广播(Broadcast)、通知(Notification)、更新文件/数据库等方式告知结果。只能手动调用停止,如服务内自己调用stopSelf或外部调用stopService销毁。
启动型服务的生命周期为:onCreate() → onStartCommand() → (运行中) → onDestroy()。其中onCreate()只会在初次创建服务时调用,多次startService只会重复触发onStartCommand(),而不会触发onCreate()。onDestroy()在服务销毁时触发,来清理所有资源,如线程、注册的侦听器、接收器等。
其中需要关注的是onStartCommand()的返回值。有三种返回:
| 返回值 | 含义 | 说明 |
|---|---|---|
| START_STICKY | 被系统杀死后重启(不带intent) | 当Service因内存不足而被系统kill后,一段时间后内存再次空闲时,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand(),但其中的Intent将是null,除非有挂起的Intent,如pendingintent。这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似服务 |
| START_NOT_STICKY | 不重启 | 当Service因内存不足而被系统kill后,即使系统内存再次空闲时,系统也不会尝试重新创建此Service。除非程序中再次调用startService启动此Service。这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务 |
| START_REDELIVER_INTENT | 重启并重新传intent | 当Service因内存不足而被系统kill后,则会重建服务,并通过传递给服务的最后一个Intent调用onStartCommand(),任何挂起Intent均依次传递。与START_STICKY不同的是,其中的传递的Intent将是非空,是最后一次调用startService中的intent。这个值适用于主动执行应该立即恢复的作业(例如下载文件)的服务 |
绑定型
当Service处于绑定状态时,其代表着客户端-服务器模式中的服务器。其他组件(如 Activity)绑定到Service时,组件可以向Service(也就是服务端)发送请求,或者调用Service的方法。
宿主解除绑定后,绑定服务就会被销毁。
基于 IBinder 通信
TODO
Foreground Service
TODO