You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android前台服务启动即终止,BLE扫描回调栈溢出问题求助

解决BLE前台服务崩溃与后台存活问题

1. 修复致命的StackOverflowError

你的进程终止核心原因是无限递归调用:BleScanCallback的onScanFailed方法内部直接调用了自身,导致栈溢出。替换为实际错误处理逻辑即可:

override fun onScanFailed(errorCode: Int) {
    super.onScanFailed(errorCode)
    // 替换成具体的错误处理,比如日志上报或状态通知
    Log.e("BleScan", "扫描失败,错误码: $errorCode")
    // 移除自身调用onScanFailed(errorCode)的代码
}

2. 确保前台通知正常显示

Android要求前台服务的通知必须设置小图标,否则通知不会显示,甚至会影响服务启动。取消setSmallIcon的注释并替换为你项目中的图标资源:

val notification = NotificationCompat.Builder(this, channelId)
    .setContentTitle("Bluetooth Scanning")
    .setContentText("Bluetooth scanning is running in the background.")
    .setSmallIcon(R.drawable.ic_bluetooth) // 必须设置,替换为实际图标
    .build()

3. 优化服务存活与启动逻辑

  • 调整返回值:将onStartCommand的返回值改为START_STICKY,确保服务被系统回收后能自动重启(修复递归错误后生效):
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // ... 原有逻辑
        return START_STICKY
    }
    
  • 权限检查:确保已申请并授予BLE扫描相关权限:
    • Android 12+:BLUETOOTH_SCAN、BLUETOOTH_ADMIN
    • Android 11及以下:额外需要ACCESS_FINE_LOCATION
  • 后台线程执行扫描:BLE扫描逻辑要放在后台线程,避免阻塞主线程导致ANR,建议在bluetoothUtils.startScanning内部用协程或线程处理。

4. 优化前后台监听时机

用ProcessLifecycleOwner监听应用全局前后台状态,比Activity的onPause/onResume更可靠(避免Activity重建导致的异常):

// 在Application类或MainActivity的onCreate中初始化
ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver {
    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
        startService(Intent(this@MainActivity, BluetoothScanService::class.java))
    }

    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        stopService(Intent(this@MainActivity, BluetoothScanService::class.java))
    }
})

内容的提问来源于stack exchange,提问作者Deusnominus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:55:57