当可穿戴设备处于环境模式时,为什么不调用onSensorChange

时间:2015-07-01 13:17:40

标签: android service android-sensors ambient

我正在开发一个可穿戴的应用程序,我注意到一个奇怪的行为。 我有一个班级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秒钟我没有接到电话。 / p>

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

我已经设法强制onSensorChanged()在没有连接到USB的情况下,在环境模式下使用Activity中的手动wakeLock

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

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

任何建议将不胜感激:)

1 个答案:

答案 0 :(得分:1)

1.当系统处于环境模式时,CPU的运行与正常情况相同,这意味着在环境模式下大部分时间,CPU处于休眠状态。因此,除非传感器是唤醒传感器,否则它无法唤醒系统,因此您无法接收onSensorChanged。它用于插入USB的原因是,当使用USB进行调试时,CPU不会睡眠。

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

3.您发布的代码似乎是您注册了TYPE_ACCELEROMETER传感器,此传感器具有唤醒版本和非唤醒版本,可能会尝试后者。