Изменение ориентации аннулирует ссылку SensorManager

Я делаю приложение, которое подключает прослушиватели местоположения и датчиков, чтобы затем записывать изменения из них в файл.

Что странно, так это то, что один из телефонов, использующих приложение, в некоторых случаях закрывался принудительно, что я сузил до изменения ориентации: если телефон изменил ориентацию во время записи, атрибут SensorManager, который я сохранил внутри действия как «mSensorManager», тогда будет установить на ноль.

Это приводит к моему вопросу: не следует ли мне хранить ссылку SensorManager из-за того, что это плохой выбор дизайна? Или это нормально, и я должен просто проверить, является ли ссылка нулевой, прежде чем использовать ее?

EDIT: две вещи, которые нужно добавить:

  1. Я обнаружил, что не только атрибуты акселерометра и магнитометра также были обнулены (что имело смысл), но и менеджер местоположения (который не вносит особых изменений, так как не имеет ничего общего с определением ориентации);

  2. Должен ли я хранить эти атрибуты внутри чего-то другого, кроме действия, которое не аннулирует ссылки при изменении ориентации?

Что это дало мне: исправление инстанцирования прослушивателя, менеджера и сенсора, которое должно выполняться в рамках жизненного цикла действия. Тогда единственная проблема была с вейк-локом, который был разрушен, но мне нужно было удержаться при смене ориентации. Я изменил его, чтобы он также приобретался в течение жизненного цикла активности, хотя и на другой фазе.


person ravemir    schedule 11.12.2012    source источник


Ответы (2)


  1. попробуйте после добавления этой строки внутри тега активности в манифест

     android:configChanges="orientation|keyboardHidden"
    

    Я предполагаю, что это аннулирует, потому что при изменении ориентации onCreate вызывается для этого действия

  2. Попробуйте сохранить значения, используя общие настройки.
person Shruti    schedule 11.12.2012
comment
Я не слышал об общих настройках, но название намекает, что они предназначены для системных объектов, а не для настроек приложения. Несмотря на это, мой метод onCreate, вероятно, создает экземпляры системных объектов, которые можно протолкнуть дальше по пути выполнения, возможно, я попробую это и посмотрю на сохраненный пакет экземпляров. - person ravemir; 11.12.2012
comment
В комплекте ничего нет, но ваш пост как бы указал мне правильное направление. Я начал создавать объекты датчика и менеджера в методе onCreate, но затем кнопка переключения, которая у меня была, взорвалась из-за объекта блокировки экрана, который у меня был. Это намекало на то, что тем временем я потерял свою переменную wakeLock, что является совершенно другой проблемой. Может он должен быть статичен? - person ravemir; 11.12.2012
comment
Я чувствую, что вы должны получить признание за то, что направили меня на правильный путь, но ответ заключается не в том, что решило это для меня, а в осознании того, что изменения ориентации вызывают перезапуск деятельности. Что нам делать? - person ravemir; 12.12.2012
comment
Ответ на это находится в 1-м пункте ответа, чтобы добавить android: configChanges.. и если он направил вас в правильном направлении, вы можете проголосовать за ответ. - person Shruti; 12.12.2012

Что это дало мне: исправление инстанцирования прослушивателя, менеджера и сенсора, которое должно выполняться в рамках жизненного цикла действия. Тогда единственная проблема была с вейк-локом, который был разрушен, но мне нужно было удержаться при смене ориентации. Я изменил его, чтобы он также приобретался в течение жизненного цикла активности, хотя и на другой фазе.

person ravemir    schedule 21.12.2012