我在我的应用程序中使用运动传感器检测。
我的设计是这样的:一个类从主要活动中获取传感器服务引用,然后实现 SensorEventListener。也就是说,MainActivity 不会监听传感器事件的变化:
public void onCreate(Bundle savedInstanceState) {
// ... code
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// The following is my java class, it does not extends any android fragment/activty
mShakeUtil = new ShakeUtil(mSensorManager,mAccelerometer,this);
// ..more code..
}
不幸的是,我无法重新设计ShakeUtil,因此它既不是片段也不是活动。现在为了说明问题考虑:
- MainActivity 即将被销毁/暂停。即屏幕旋转
- ShakeUtil 的 onSensorChanged(SensorEvent event) 在此过程中被调用..
onSensorChanged 内部发生的一件事是对话交互,它给出了错误:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
当前一个发生在 MainActivity 的 onSaveInstanceState 和 onPause 之间时。我知道如果我成功检测到 MainActivity 正在 ShakeUtil 中暂停,则可以避免这种情况。
如何检测 MainActivity 正在暂停或从 ShakeUtil 调用 onSaveInstanceState?
或者,如何在不使 Shakeutil 扩展活动的情况下避免此问题?
到目前为止,我已经尝试过使用标志变量,但这还不够好,我猜这些不是原子操作。我尝试使用 Activity 的 isChangingConfigurations(),但我得到一个未记录的“NoSuchMethodFound”错误。我通过在主活动中的 onPause 时调用 ShakeUtil 来取消注册传感器