05-Service修订差异说明
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_STICKY、START_STICKY、START_REDELIVER_INTENT。- Bound Service 多客户端绑定机制。
onUnbind()、onRebind()。onServiceDisconnected()的真实含义。- 前台服务通知要求。
- Android 8.0 后台服务限制。
- Android 12 后台启动前台服务限制。
- Android 14 前台服务类型和权限要求。
- Android 15 部分前台服务从
BOOT_COMPLETED启动限制。 - WorkManager 的适用场景。
4. 面试版最终结论
Service 面试不要只背生命周期图,重点要讲出:
- Service 是组件,不是线程;默认运行在主线程。
- 耗时任务必须自己放到线程、线程池或协程中。
- Started Service 需要显式停止。
- Bound Service 依赖客户端绑定,所有客户端解绑后,如果没有 started 状态才销毁。
- 同时 start + bind 时,必须停止 started 状态并解除所有绑定,Service 才会真正销毁。
- Android 8.0 以后后台服务受限,不能再简单说 Service 可以后台无限运行。
- 用户可感知的持续任务用 Foreground Service;可延迟且要求可靠的后台任务用 WorkManager。