Flutter前台服务中pedometer的stepCountStream手机休眠时无回调
解决Android休眠时Flutter Pedometer包无法触发步数回调的问题
你的前台服务定时器在休眠时正常运行,说明服务本身没问题,问题出在Android系统对步数传感器的休眠限制上,结合华为P9 Lite(Android7.0)的特性,试试以下方案:
1. 关闭华为设备的应用省电限制
华为自带的省电策略会在屏幕休眠时限制传感器后台活动,手动配置步骤:
- 打开「设置」→「电池」,关闭「省电模式」或「超级省电」
- 进入「应用启动管理」,找到你的应用,切换为「手动管理」,勾选「允许后台活动」
- 进入「电池优化」,找到应用并设置为「不允许优化」
2. 配置传感器唤醒标记与WakeLock
普通步数传感器在屏幕休眠时会被系统暂停,需要使用支持唤醒的传感器类型:
- 如果pedometer包支持自定义传感器配置,确保注册时添加
SENSOR_FLAG_WAKE_UP标记,强制传感器在休眠时仍能触发事件 - 若包不支持,可通过MethodChannel调用Android原生Sensor API:
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor stepCounter = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); // 注册带唤醒标记的传感器监听 sensorManager.registerListener(stepListener, stepCounter, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_FLAG_WAKE_UP);
- 同时在前台服务中持有Partial WakeLock,保证CPU休眠时仍能处理传感器事件:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::StepLock"); wakeLock.acquire();
记得在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
3. 调整传感器监听的注册时机
延迟注册pedometer stream,确保前台服务完全初始化完成:
Future<void> activatePedometer(ServiceInstance service) async { // 延迟2秒等待服务稳定 await Future.delayed(const Duration(seconds: 2)); Stream<StepCount> pedometerStream = Pedometer.stepCountStream; var subscription = pedometerStream.listen((stepCount) async { print("STEP DATA LISTENED!!!"); }); Timer.periodic(const Duration(seconds: 1), (timer) async { print('TIMER: ${DateTime.now()}!!!'); }); }
4. 核对Manifest权限
确保已添加必要的传感器权限:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-feature android:name="android.hardware.sensor.stepcounter" /> <uses-feature android:name="android.hardware.sensor.stepdetector" />
内容的提问来源于stack exchange,提问作者Mustafa Karakuş
相关产品推荐
相关产品推荐

