2

我正在开发一个可穿戴应用程序,我注意到一个奇怪的行为。我有一个类FooService extends Service implements SensorEventListener,我已经覆盖了onSensorChanged()方法:

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
    if (sensorEvent.sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
        Log.e(TAG, getString(R.string.err_wrong_sensor_registered));
        return;
    }
    float x = sensorEvent.values[0];
    float y = sensorEvent.values[1];
    float z = sensorEvent.values[2];
    ...
    }

该服务从FooActivity extends WearableActivity- 这里我覆盖onEnterAmbient()onExitAmbient()方法只做一些 UI 更改(不与服务交互)。

一切正常我在设备插入 USB 时接到 onSensorChanged() 呼叫,无论是环境模式还是正常模式,但不幸的是,在设备未连接到 USB 时进入环境模式 3 秒后我没有接到呼叫。

Q1:所以我的问题是为什么在环境模式下并且未连接到 USB 时不调用 onSensorChanged() 方法?

在未连接到 USB 和环境模式时,我已经设法在 Activity 中使用手动唤醒锁强制 onSensorChanged()

  wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");

Q2:Activity不应该通过ambientMode机制自动获取wakeLock吗?

任何建议将不胜感激:)

4

1 回答 1

1

1.当系统处于环境模式时,CPU 正常运行,这意味着在环境模式下的大部分时间,CPU 都处于休眠状态。因此除非传感器是唤醒传感器,否则它无法唤醒系统,因此您不会收到 onSensorChanged。它之所以能在插入 USB 时起作用,是因为使用 USB 调试时,CPU 不休眠。

2.Ambient 确实有保持系统唤醒的机制,但CPU 不应该休眠的唯一情况是CPU 正在进行绘图动作(通常是刷新时钟壁纸)。Ambient 旨在节省电量,因此在活动中添加唤醒锁定是一个坏主意。

3.你贴的代码好像你注册了一个TYPE_ACCELEROMETER传感器,这个传感器有wakeUp版本和non-wakeUp版本,可以试试后者。

于 2016-07-12T09:19:35.520 回答