gpt4 book ai didi

Android 的 SensorManager 无法有效注销监听器

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:50 25 4
gpt4 key购买 nike

我的应用程序创建了一个 Service,它覆盖了 onStartCommand 以创建一个 SensorManager 并将一个 SensorEventListener 附加到其中一个传感器:

public class AccelerometerService extends Service {
private SensorManager sensorManager;
private Sensor sensor;
private SensorEventListener activeListener;
// ...

@Override
public int onStartCommand(Intent intent, int flags, int startid) {
// ...

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
activeListener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override
public void onSensorChanged(SensorEvent event) {
Log.i("PluckLock", "" + event.values[0]);
}
};

sensorManager.registerListener(activeListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);

return START_STICKY;
}

// ...
}

完整代码可在 GitHub 上获得.

我想覆盖 ServiceonDestroy() 方法,并在其中杀死传感器:

sensorManager.unregisterListener(activeListener);

但是当我这样做时,实际上什么也没有发生!我的 onSensorChanged() 监听器继续从加速度计(或软件 LINEAR_ACCELERATION 传感器,在我的例子中)接收正确的值。这个问题,当然是在docs这里引用的。 :

Always make sure to disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours.

只要屏幕实际解锁,我的应用程序只需要对加速度计执行 ping 操作。我已经实现(并验证了正确的功能)BroadcastReceiver,当手机被锁定时,它会破坏 Service,并成功调用它的 onDestroy() 方法。但是,一旦我尝试取消注册听众,实际上什么也没有发生。

我发现其他一些人也在问这个问题,但没有解决。

我只能假设这是一个 API 错误,一旦我开始从这些传感器获取数据,就真的没有什么好的方法可以杀死它们。我尝试将 SensorManagerSensorSensorEventListener 设置为 null,并尝试向管理器注册一个 null 传感器监听器。这些都不会影响投票。

我当前的“解决方法”对电池生命周期几乎没有影响。我在类的定义中有一个私有(private) bool 值,我将其设置为 truefalse,具体取决于我是否需要传感器值。在我的 onSensorChanged() 方法中,如果传感器监听器应该处于非 Activity 状态,我会立即返回。但到那时,为时已晚:在我设法离开 onSensorChanged() 方法之前,操作系统正在执行的工作(获取传感器值)首当其冲,因此电池生命周期仍然很糟糕只要我的服务在运行。

我真正的问题是,除了一些奇迹般的真实解决方案,我能做些什么来停止获取传感器值?显然,注销传感器监听器此时不起作用观点;即使将所有内容都设置为 null 并销毁服务也没有任何效果。但必须有某种方式向操作系统指示我的应用程序不再需要使用传感器值。有没有办法杀死我的整个应用程序,只有在手机解锁时才重新启动它?也许这会让操作系统知道我的应用程序不再需要值了。真的,任何合法地停止轮询传感器但给我一些重新启动它的方法的解决方案,即使代码很丑陋,都会让我开心。

我的项目的最低 API 级别是 9。

最佳答案

我遇到了类似的问题。

阻止传感器耗尽电池电量的解决方法。

我使用了静态 bool 值 mIsSensorUpdateEnabled。当您想停止从传感器获取值时,将其设置为“false”。在 onSensorChanged() 方法中,检查 bool 变量的值并再次调用取消注册传感器。而这一次,它起作用了。传感器将取消注册,您将不再获得 onSensorChanged 回调。

    public class MainActivity extends Activity implements SensorEventListener{
private static boolean mIsSensorUpdateEnabled = false;
private SensorManager mSensorManager;
private Sensor mAccelerometer;

@override
protected void onCreate(){
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}

private startSensors(){
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
int delay = 100000; //in microseconds equivalent to 0.1 sec
mSensorManager.registerListener(this,
mAccelerometer,
delay
);
mIsSensorUpdateEnabled =true;
}

private stopSensors(){
mSensorManager.unregisterListener(this, mAccelerometer);
mIsSensorUpdateEnabled =false;
}


@Override
public void onSensorChanged(SensorEvent event) {
if (!mIsSensorUpdateEnabled) {
stopSensors();
Log.e("SensorMM", "SensorUpdate disabled. returning");
return;
}
//Do other work with sensor data
}
}`

关于Android 的 SensorManager 无法有效注销监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26946391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com