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

求助:Google Activity Recognition Transition API在Android12+中无故停止

Google Activity Recognition Transition API 无故停止工作的排查与解决建议

问题概述

开发基于Google Activity Recognition Transition API的GPS追踪Android应用时,遭遇API无规律停止工作的异常:

  • 涉事设备:Android 12(SDK_INT 31),三星品牌
  • 故障表现:API运行1天至1周后突然停止,无任何错误日志;仅设备重启可恢复,重装应用无法解决
  • 特殊场景:有时仅本应用API失效,其他同API应用正常;有时所有使用该API的应用均失效
  • 测试覆盖:本地构建APK、签名包、Google Play内部测试版本均出现该问题

应用逻辑:通过前台服务在首次启动时激活API,核心代码如下:

核心代码片段

val intent = Intent(ACTIVITY_RECOGNITION_EVENT)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
} else {
    PendingIntent.FLAG_UPDATE_CURRENT
})

// 请求Activity Updates
val activityRecognitionClient = ActivityRecognition.getClient(context)
val interval = 3 * 60 * 1000L
val task = activityRecognitionClient.requestActivityUpdates(interval, pendingIntent)
task.addOnSuccessListener { ... }
task.addOnCompleteListener { ... }
task.addOnCanceledListener { ... }
task.addOnFailureListener { ... }

// 请求Activity Transition Updates
val task = activityRecognitionClient.requestActivityTransitionUpdates(
    createRequest(),
    pendingIntent
)
task.addOnSuccessListener { ... }
task.addOnCanceledListener { ... }
task.addOnFailureListener { ... }
task.addOnCompleteListener { ... }

// 广播接收器
private val transitionsReceiver = object: BroadcastReceiver() {
    override fun onReceive(_context: Context, intent: Intent) {
        if (ActivityRecognitionResult.hasResult(intent)) {
            val result = ActivityRecognitionResult.extractResult(intent)
            ...
        }
        else if (ActivityTransitionResult.hasResult(intent)) {
            val result = ActivityTransitionResult.extractResult(intent)
            ...
        }
    }
}

val intentFilter = IntentFilter()
intentFilter.addAction(ACTIVITY_RECOGNITION_EVENT)
context.registerReceiver(transitionsReceiver, intentFilter)

排查与解决建议

1. 修正PendingIntent的唯一性与配置

  • 目前使用的requestCode为0,若应用内其他模块也用相同requestCode创建PendingIntent,会导致注册被覆盖。建议使用全局唯一的requestCode(如const val REQUEST_CODE_ACTIVITY_RECOG = 1001),避免冲突。
  • 确认Android 12+下FLAG_MUTABLE的正确性:系统向广播接收器发送带数据的Intent时,该标记是必需的,切勿误设为FLAG_IMMUTABLE。

2. 强化前台服务的稳定性

  • 前台服务必须持续展示高优先级通知,三星等厂商会对低优先级通知的前台服务进行后台限制。设置通知优先级为Notification.PRIORITY_HIGH或NotificationManager.IMPORTANCE_HIGH,并明确标注应用正在运行的状态。
  • 监听前台服务生命周期,在onDestroy或被系统回收时自动重新注册API;同时用WorkManager定期(如每2小时)检查API活跃状态,若失效则触发重注册。

3. 绕过厂商电池优化限制

  • 三星Android 12+的电池优化策略严格,需引导用户将应用加入电池优化白名单(通过ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS申请权限)。
  • 检查设备“智能管理器”或“设备维护”设置,确保应用未被设为“后台限制”或“深度睡眠”模式。

4. 实现API状态自动校验与修复

  • 由于无错误日志,可通过WorkManager定期执行校验:
    1. 尝试调用activityRecognitionClient.removeActivityUpdates(pendingIntent),若成功则说明之前的注册已失效;
    2. 重新调用requestActivityUpdates和requestActivityTransitionUpdates完成注册。
  • 在广播接收器中添加心跳日志,若连续3个周期未收到回调,立即触发重注册逻辑。

5. 优化注册时机与上下文

  • 不要仅在应用首次启动时注册API,建议在设备开机完成(监听ACTION_BOOT_COMPLETED广播)、应用从后台切回前台时,重新校验并注册API。
  • 使用Application上下文创建PendingIntent和ActivityRecognitionClient,避免因Activity/Service上下文被回收导致注册失效。

6. 增强自定义日志采集

  • 在API注册的所有回调(成功、失败、取消)中添加详细日志,包含时间戳、设备状态(电量、网络、充电状态);同时在广播接收器中记录每次回调事件。
  • 用Firebase Crashlytics或自定义日志服务定期上传日志,便于分析故障发生前的设备状态。

7. 排查Google Play服务异常

  • API失效可能源于Google Play服务更新异常,可在应用中检查服务版本,若版本过低引导用户更新;同时调用GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)验证服务可用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:31:04