什么是前台服务?它与普通服务的主要区别是什么?

解读

在国内面试中,这道题几乎必问,因为它同时考察“对 Android 8.0 后台限制政策的理解”和“对用户体验保活的落地经验”。面试官想听的不只是“startForeground 与 startService 的区别”,而是:

  1. 为什么 Google 从 7.0 开始收紧后台,8.0 又强制前台通知;
  2. 国内 ROM 如何在此基础上再做限制(如小米、华为、OPPO 的“自启动/后台启动”开关);
  3. 你在音乐、导航、健康计步、VoIP 等真实场景里,怎样保证进程存活又不被应用市场下架。
    答不到“通知栏常驻 + 渠道适配 + 双进程守护 + 厂商白名单”这一层,就会被认为“没做过 toC 线上项目”。

知识点

  1. 前台服务定义:执行用户“可感知”的操作,必须在 5 秒内调用 startForeground(id, Notification),并关联 NotificationChannel(targetSdk≥26)。
  2. 生命周期:与普通服务一样走 onCreate/onStartCommand/onDestroy,但系统会将其视为“前台进程”级别,OOM 阈值与可见进程相同。
  3. 限制差异:
    • 普通服务在应用进入后台 1 分钟后被系统 idle,Android 8.0 以上直接抛出 IllegalStateException 限制后台启动;
    • 前台服务不受后台启动限制,但必须挂常驻通知,用户可手动划掉通知杀进程。
  4. 国内特殊点:
    • 厂商把“前台通知”纳入“通知管理”开关,关闭后仍可被系统杀;
    • 部分 ROM 把 512 KB 以上通知图标判定为“恶意保活”,直接拒绝展示;
    • 小米/华为后台启动权限需引导用户手动开启,否则 startForeground 抛异常。
  5. 适配技巧:
    • 双通道:IMPORTANCE_LOW 的静音通道 + IMPORTANCE_DEFAULT 的可听通道,根据业务动态切换;
    • 折叠通知:使用 setCustomContentView 做 64 dp 小图标,降低用户投诉;
    • 灰色保活:利用 JobScheduler/ForegroundService 混合方案,5 分钟切一次,降低连续常驻标记;
    • 合规:Google Play 对“滥用前台服务”直接下架;国内应用市场要求在上架页面勾选“前台服务使用场景”并截图说明。

答案

前台服务(Foreground Service)是 Android 提供的一种特殊 Service,它表示应用正在执行用户“可感知且重要”的任务(如音乐播放、导航、运动记录、VoIP 通话)。启动后必须在 5 秒内调用 startForeground(int id, Notification notification) 并绑定 NotificationChannel,否则系统会抛 ForegroundServiceStartNotAllowedException(Android 12+ 明文抛出)。由于系统将其进程优先级提升到“前台进程”级别,在内存不足时最不容易被回收,也不受 Android 8.0 后台启动限制。
普通服务(普通 startService)默认是“后台服务”,进程优先级为“服务进程”,在后台运行超过 1 分钟会被系统标记为 idle,Android 8.0 以后若应用处于后台,直接禁止启动后台服务,除非绑定前台服务或使用 JobScheduler。
因此二者核心区别可归纳为三点:

  1. 用户感知:前台服务必须展示常驻通知,普通服务无界面;
  2. 系统限制:前台服务可突破后台启动限制,普通服务在 Android 8.0+ 受限;
  3. 进程优先级:前台服务享有“前台进程”级 oom_adj,普通服务仅“服务进程”级,更易被回收。

拓展思考

  1. Android 13 引入“运行时前台服务权限”FOREGROUND_SERVICE_*,需提前在 Manifest 声明对应类型(media、location、connectedDevice 等),并在上架 Google Play 时填写使用声明,否则无法通过审核。
  2. 国内项目若需“强保活”,建议把核心逻辑拆到独立:remote 进程,前台服务只负责提权,业务数据通过 AIDL 回传,避免主进程被杀导致通知消失。
  3. 对于折叠屏、车载多窗口场景,前台服务通知需适配大尺寸图标与动态布局,否则通知栏会被系统截断,影响品牌形象。
  4. 如果业务只是“后台下载”,优先使用 WorkManager + setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST),系统会自动决定是否提升为前台服务,既省电又合规。