Android вызывает onCreate () после finish () в альбомной ориентации

У меня есть действие, которое запускает системную службу вибратора в его методе onCreate, затем, когда пользователь нажимает кнопку, он отменяет вибратор, а затем вызывает finish (), чтобы закрыть действие.

Это действие вызывается через AlarmManager, поэтому, когда оно закрывается, оно вернет пользователя в любое приложение, которое у него в данный момент было открыто (не обязательно мое).

Проблема, с которой я сталкиваюсь, заключается в том, что моя деятельность находится в ландшафтном режиме, и пользователь попадает на экран, который не поддерживает альбомную ориентацию (например, домашний экран), когда действие закрывается, мое приложение переключается в портретный режим и вызывает onCreate ( ) перед закрытием экрана. Итак, шаги, вызывающие эту проблему, следующие ...

  • Действие запускается в портретном режиме.
  • вызывается метод onCreate, который запускает вибратор
  • Пользователь переворачивает телефон в альбомный режим.
  • onCreate вызывается снова, но поскольку onSaveInstanceState не имеет значения null, я могу пропустить повторный запуск вибратора
  • Пользователь нажимает кнопку, чтобы закрыть экран
  • Я вызываю vibrator.cancel ()
  • Я называю финиш ()
  • Поскольку экран, на котором пользователь будет возвращен на экран, который не поддерживает альбомный режим, мое действие вызывает onCreate ()
  • saveInstanceState равен нулю, поэтому вибратор снова запускается
  • Мое приложение закрыто, а вибратор все еще работает

В настоящее время я могу придумать единственный способ исправить это - сделать так, чтобы моя деятельность поддерживала только портретный режим, но я бы хотел избежать этого, если смогу. Кто-нибудь знает, как я могу предотвратить вызов onCreate () после вызова finish ()?


person Rabbit    schedule 22.02.2013    source источник


Ответы (1)


почему ты не называешь метод

onPause() или onStop() и внутри этого метода вызывают vibrator.cancel()

onStop () всегда вызывается, когда ваше приложение больше не отображается.

ознакомьтесь с этой блок-схемой

person Eliud    schedule 22.02.2013
comment
Это работает, но явно не оптимально. Когда я делаю это таким образом, я нажимаю кнопку, чтобы остановить вибратор, он останавливается, затем, когда я вызываю завершение, он запускается снова примерно на 3 секунды, затем снова останавливается (по-видимому, это время, которое требуется для Android, чтобы вызвать onCreate и onStop после Я звонил finish (), по крайней мере, на свой телефон). - person Rabbit; 22.02.2013
comment
как насчет onPause, который работает быстрее, чем onStop (). - person Eliud; 22.02.2013
comment
@eluid Если я перенесу свой код для запуска вибратора в onResume, а затем поставлю отмену в onPause, похоже, он работает нормально. Спасибо за вашу помощь. - person Rabbit; 23.02.2013