У меня есть услуга, которая мне необходима для выполнения следующих условий
1) Служба должна работать, пока приложение находится на переднем плане.
2) Когда активность вращается, не останавливайте службу
3) Служба должна оставаться активной, даже если вы сворачиваете приложение, когда открыт один конкретный фрагмент.
4) Когда действие остановлено (не с помощью поворота) и это не конкретный фрагмент, остановите службу.
Я запускаю/останавливаю свои службы в файле onstart/onstop. В итоге я использовал логическое значение, чтобы отслеживать, вращается ли экран.
Я запускаю/останавливаю свои услуги следующим образом
context.getApplicationContext().startService(намерение)
context.getApplicationContext().stopService(намерение)
Все работало отлично, за исключением одного случая.
Когда вы выключаете экран в альбомной ориентации, Android по какой-то причине решает, что ему нужно воссоздать всю активность, и вызывает через весь жизненный цикл. Я воспроизвел это в базовом приложении на 4.4 и 5.0.1, и это было показано в других темах, таких как эта.
Проблемы с пониманием жизненного цикла, когда экран выключается и на
Когда это происходит, нельзя полагаться на вращение/не вращение, и я предполагаю, что из-за того, как быстро все происходило (несколько onStop/onStarts), это вызывало состояние гонки. Когда я возвращался в приложение, иногда оно работало, иногда зависало (ошибок не было), иногда работали две службы.
Это стало кроличьей норой, где я начал проверять, например, был ли экран выключен, когда он входил в onStart, поэтому в следующий раз, когда onStart вызывался, он знал, что возвращается с экрана без воссоздания, который был помечен как повернутый (поскольку Android теперь поворачивал его обратно в альбомную ориентацию с экрана блокировки в портретной ориентации). Это становилось смешным и плохо работало.
Один поток предложил использовать безголовый фрагмент, чтобы он выжил при вращении, но мне все еще нужно, чтобы он останавливался, когда приложение закрывается, поэтому я в конечном итоге застрял с той же проблемой.
Есть ли рекомендуемые способы решения этой проблемы? Нельзя допустить, чтобы служба оставалась активной, если приложение закрыто (за исключением фрагмента 1), это просто приведет к огромной разрядке батареи, и ей нужно пережить ротацию, иначе она будет прерывать работу.