【问题标题】:Why onSensorChange is not invoked when Wearable device is in Ambient Mode为什么可穿戴设备处于环境模式时不调用 onSensorChange
【发布时间】:2015-07-01 13:17:39
【问题描述】:

我正在开发一款可穿戴应用,但我发现了一个奇怪的行为。 我有一个课程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:所以我的问题是为什么 onSensorChanged() 方法在环境模式下并且未连接到 USB 时没有被调用?

我已经设法在未连接到 USB 并且在环境模式下使用 Activity 中的手动唤醒锁定强制 onSensorChanged()

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

但是

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

任何建议将不胜感激:)

【问题讨论】:

    标签: android service android-sensors ambient


    【解决方案1】:

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

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

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

    【讨论】:

    • 你能解释更多关于加速度计唤醒版本的信息吗?我只熟悉非唤醒版本。我认为 sesor 可以是或不唤醒或不唤醒两者。
    • 并非所有传感器都有唤醒系统的能力。 source.android.com/devices/sensors/suspend-mode.html
    • 一个简单的检查方法:adb shell dumpsys sensorservice |grep Accelerometer Sensor (WAKE_UP)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多