Service 修订差异说明

1. 原 PDF 内容范围

原 PDF 主要包括:

  • Service 基本概念。
  • Service 与 Thread 区别。
  • startService()bindService() 两种启动方式。
  • Started Service 生命周期。
  • Bound Service 生命周期。
  • 同时 start 和 bind 时的停止规则。
  • 屏幕旋转导致 Activity 重建时绑定断开的情况。
  • onStart()onStartCommand() 的版本说明。

2. 主要修订点

原 PDF 表述 修订后表述 原因
Service 可以在后台执行长时间运行操作 现代 Android 中后台 Service 受到限制,长任务要区分前台服务和 WorkManager Android 8.0 起后台执行限制增强
Service 运行于 UI 线程,因此不能耗时 保留并强化:Service 默认在主线程,必须自己切线程/协程 这是关键点,很多人误以为 Service 自带后台线程
startService 后服务可在后台无限期运行 加入 Android 8.0 后台限制说明 后台 Service 不再能随意长期运行
onStart 会被调用多次 修正为现代项目关注 onStartCommand() onStart() 已过时
onDestory() 修正为 onDestroy() 原文拼写错误
只讲 startService / bindService 补充 Foreground Service、后台限制、WorkManager 现代 Android 面试必问
Service 与 Activity 通信必须绑定 修订为“绑定是常见方式,但也可用广播、PendingIntent、Repository、通知、Messenger/AIDL 等” 原文表述偏窄
未区分 Android 版本差异 补充 Android 8/12/14/15 相关限制 面试和项目中非常重要

3. 补充内容

本次补充了:

  • Service 与 Thread 的本质区别。
  • Service 默认运行在主线程的 ANR 风险。
  • onStartCommand() 返回值:START_NOT_STICKYSTART_STICKYSTART_REDELIVER_INTENT
  • Bound Service 多客户端绑定机制。
  • onUnbind()onRebind()
  • onServiceDisconnected() 的真实含义。
  • 前台服务通知要求。
  • Android 8.0 后台服务限制。
  • Android 12 后台启动前台服务限制。
  • Android 14 前台服务类型和权限要求。
  • Android 15 部分前台服务从 BOOT_COMPLETED 启动限制。
  • WorkManager 的适用场景。

4. 面试版最终结论

Service 面试不要只背生命周期图,重点要讲出:

  1. Service 是组件,不是线程;默认运行在主线程。
  2. 耗时任务必须自己放到线程、线程池或协程中。
  3. Started Service 需要显式停止。
  4. Bound Service 依赖客户端绑定,所有客户端解绑后,如果没有 started 状态才销毁。
  5. 同时 start + bind 时,必须停止 started 状态并解除所有绑定,Service 才会真正销毁。
  6. Android 8.0 以后后台服务受限,不能再简单说 Service 可以后台无限运行。
  7. 用户可感知的持续任务用 Foreground Service;可延迟且要求可靠的后台任务用 WorkManager。