在 Android Wear 中,使用 SensorManager 重复注册和取消注册 SensorEventListeners 会导致 SensorManager 失败。我想知道是否有一种方法可以让我在每次加载 fragment 时都获得一个新的 SensorManager 实例。这样我就可以获得一个新的 SensorManager,注册我的监听器,并在 fragment 被销毁时注销它们,然后取消引用该 SensorManager 并在下次加载 fragment 时获得一个新的。
在我的 fragment 中,我目前正在这样做:
@Override
public View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
// ...
mSensorMgr = (SensorManager) mMainWearActivity.getSystemService(Activity.SENSOR_SERVICE);
// ...
}
private void startListening(){
yGesture.setOnShakeListener(yListener);
xGesture.setOnShakeListener(xListener);
mSensorMgr.registerListener(yGesture, mSensorMgr.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
mSensorMgr.registerListener(xGesture, mSensorMgr.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onResume(){
super.onResume();
startListening();
}
@Override
public void onPause(){
stopListening();
super.onPause();
}
private void stopListening(){
mSensorMgr.unregisterListener(yGesture);
mSensorMgr.unregisterListener(xGesture);
mSensorMgr = null;
}
我需要 mSensorMgr = (SensorManager) mMainWearActivity.getSystemService(Activity.SENSOR_SERVICE);
来返回一个新实例,否则多次注册和注销监听器会使 SensorManager 失败。这可能吗?最好不必创建新的 Activity 并坚持使用 fragment 。谢谢
编辑:
我已将使用 sensorManager 注册监听器的操作移至 onResume(),但同样的问题仍然存在。这是 Android Wear 框架中的错误吗?
最佳答案
一般来说,您总是希望使用正确配对的 Activity 或 Fragment 生命周期方法来注册和注销任何类型的监听器。因此,您可以使用创建/销毁、启动/停止或恢复/暂停。
在您的特定情况下,您正在 onCreateView 中注册,对于一个 fragment 实例,它仅被调用一次,但是,您的注销发生在 onPause 期间,这可能会被调用多次。一旦此 fragment 因任何原因暂停(并且有很多原因可能会发生这种情况),您的监听器将永远消失,直到创建该 fragment 的新实例。
因此,您可能需要考虑使用创建/销毁或启动/停止,具体取决于您尝试对 fragment 中的监听器执行的操作。如果你对这些生命周期方法不了解,请研究一下here .
关于android - 有没有办法让 getSystemService() 每次在 Android 中返回一个全新的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281850/