我正在开发一款可穿戴应用程序,我注意到了一种奇怪的行为。我有一个类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
启动的——这里我覆盖了只做一些UI更改的onEnterAmbient()
、onExitAmbient()
方法(不与服务交互(。
一切都很完美,当设备连接到USB时,无论是环境模式还是正常模式,我都会接到SensorChanged((调用,但不幸的是,在设备未连接到USB进入环境模式3秒后,我没有接到调用。
Q1:所以我的问题是,为什么在环境模式下并且没有连接到USB时,onSensorChanged((方法没有被调用
当未连接到USB且处于环境模式时,我已设法在活动中使用手动唤醒锁定来强制开启SensorChanged((
wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
但是
Q2:难道Activity不应该通过ambientMode机制自动获取wakeLock吗
如有任何建议,我们将不胜感激:(
1.当系统处于环境模式时,CPU的性能与正常情况相同,这意味着在环境模式下的大多数时间,CPU都处于睡眠状态。因此,除非传感器是唤醒传感器,否则它无法唤醒系统,因此您不会收到onSensorChanged。它之所以能插入USB,是因为在使用USB进行调试时,CPU不会休眠。
2.环境确实有保持系统清醒的机制,但CPU不应该睡眠的唯一情况是CPU正在进行绘图操作(通常刷新时钟壁纸(。环境是为了省电,所以在活动中添加唤醒锁定是个坏主意。
3.你发布的代码似乎你注册了一个TYPE_ACCELEROMETER传感器,这个传感器有唤醒版本和非唤醒版本,可以尝试后一个。