创建前台服务通知
创建前台服务通知
ANR(Application Not Responding) 错误,是 Android 系统中一个典型的 前台服务启动违规 问题。具体错误信息如下:
1 | Reason: Context.startForegroundService() did not then call Service.startForeground(): |
🔍 问题原因
从 Android 8.0(API 级别 26)开始,Google 对 前台服务(Foreground Service) 的使用做了严格限制:
- 如果你通过
Context.startForegroundService()启动一个服务, - 那么该服务 必须在 5 秒内 调用
startForeground(int id, Notification notification), - 否则系统会抛出 ANR,并可能杀死你的应用。
你的 SipAidlService 被通过 startForegroundService() 启动了,但 **没有及时调用 startForeground()**,导致系统判定为无响应。
✅ 解决方案
1. 定义权限
在AndroidManifest.xml中添加前台服务及通知权限
1 | <!-- 必须:通知权限(API 33+ 需要) 危险权限,需要动态申请--> |
动态申请
1 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { |
2. 确保在 onStartCommand() 中立即调用 startForeground()
在 SipAidlService 的 onStartCommand() 方法开头,尽快创建并显示一个有效的通知:
1 |
|
⚠️ 注意:不要在
onCreate()中调用startForeground(),因为onCreate()只在服务首次创建时调用,而startForegroundService()每次都会触发onStartCommand()。
2. 创建通知渠道(Android 8.0+ 必需)
1 | private fun createNotificationChannel() { |
定义常量:
1 | private const val String CHANNEL_ID = "sip_service_channel" |
3. 避免耗时操作阻塞 onStartCommand()
如果 onStartCommand() 中有网络请求、数据库操作、SIP 初始化等耗时任务,务必放到子线程中执行,否则即使调用了 startForeground(),主线程仍可能卡住导致 ANR。
建议使用:
HandlerThreadExecutorServiceWorkManager(不适合前台服务)- 或 Kotlin 协程(如果你用 Kotlin)
示例:
1 | new Thread(() -> { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Fleming's Blog!






