求助: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定期执行校验:
- 尝试调用
activityRecognitionClient.removeActivityUpdates(pendingIntent),若成功则说明之前的注册已失效; - 重新调用
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
相关产品推荐
相关产品推荐

