我正在开发一个可穿戴的应用程序,我注意到一个奇怪的行为。
我有一个班级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吗?
任何建议将不胜感激:)
答案 0 :(得分:1)
1.当系统处于环境模式时,CPU的运行与正常情况相同,这意味着在环境模式下大部分时间,CPU处于休眠状态。因此,除非传感器是唤醒传感器,否则它无法唤醒系统,因此您无法接收onSensorChanged。它用于插入USB的原因是,当使用USB进行调试时,CPU不会睡眠。
2.Ambient确实有一种保持系统唤醒的机制,但CPU不应该睡觉的唯一情况是CPU正在进行绘图操作(通常刷新时钟壁纸)。环境意味着节省电力,因此在活动中添加唤醒锁是一个坏主意。
3.您发布的代码似乎是您注册了TYPE_ACCELEROMETER传感器,此传感器具有唤醒版本和非唤醒版本,可能会尝试后者。