仅当用户移动时运行服务来收集传感器数据

erl*_*man 8 java android android-service android-sensors kotlin

我想在用户移动/手机不静止时跟踪传感器数据(加速度计、陀螺仪)。

我能做的事情:

  1. 使用 Sensor Listener 监听传感器数据
        sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
        
        val accelerometerSensor = 
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
    
        sensorManager.registerListener(
                accSensor,
                accelerometerSensor,
                SensorManager.SENSOR_DELAY_NORMAL
            )
Run Code Online (Sandbox Code Playgroud)
  1. 运行前台服务,即使应用程序从最近的应用程序中滑出,该服务也始终在后台保持运行以跟踪传感器
serviceIntent = Intent(context, SensorService::class.java)
context.startForegroundService(serviceIntent)
Run Code Online (Sandbox Code Playgroud)
  1. 使用监听启动完成事件的广播监听器重新启动应用程序后立即启动服务。

但我无法:

  1. 当设备停止移动时,停止收集传感器数据的传感器服务。
  2. 当用户的设备开始移动并收集传感器数据时启动传感器(未运行)。

从系统接收运动开始和运动结束通知/回调的方式可能是什么,以便我们可以决定启动/结束前台服务。

x00*_*x00 3

评论太大了,所以我将其作为答案发布。这在某种程度上是一个答案,但没有证据,只是我的经验。

我绝不是 Android 方面的专家。但我对传感器总体了解一二。最主要的是它们总是处于活动状态(如果没有完全关闭的话),并且总是有一些噪音。所以

  1. 人们不能百分百确定是否有任何运动。相反,您需要收集所有事件,选择阈值自行决定。(您可能希望聚合多个传感器的测量值来做出决定,甚至考虑测量的历史记录 - 例如,如果用户在崎岖不平的道路上行驶在汽车中,则噪音会在很长一段时间内更高)。
  2. 如果相应的代码由操作系统或您的服务执行,则能源消耗几乎没有差异。但是还有很多机会可以用代码自定义阈值、聚合和其他逻辑。这就是为什么我相信操作系统将 API 保持在最低限度,并且不存在moving starts/之类的事件moving stops
  3. 唯一消耗能量超过最低限度的是你的代码。不是其他人,而是您的代码决定是否通过持续不断的通知流来惹恼用户。

因此,请考虑聚合策略和阈值,如果未通过阈值则不显示通知,并使代码更快(这样就不会消耗太多能量)。你已经完成了......或多或少......因为这些决定并不容易做出。许多大公司的应用程序未能在所有情况下都做到正确。只需安装几个计步器应用程序,您就会发现它们都会显示不同的步数。