android - 有没有办法让 getSystemService() 每次在 Android 中返回一个全新的实例?

标签 android android-sensors sensormanager

在 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/

相关文章:

java - Gradle 项目 - 可以构建但不能运行它

Android手动X509证书链验证

android - 在 fragment 中调用 getSystemServices 时未定义?

java - 在 Android Wear OS(即 CSV)上保存和传输智能 watch 传感器数据的最佳方式是什么?

android - android中的加速度计

java - 了解 Ringdroid 代码 + Android

android - 在 Android 中通过 SQLite 保存数据时 COLUMN_NAME_NULLABLE 的必要性?

java - 如何在android中同时收集多个传感器数据并将其写入文件?

java - 简单的 Android 计步器不起作用

Android 接近传感器 - 值不正确