У меня есть сервис, который мне нужно выполнить следующие условияпроблем с сохранением службы в живых через поворот, убивая при выходе из приложения, и поворачивая экран, в ландшафтных
1) Услуга должна быть запущена в то время как приложение находится в на переднем плане.
2) Когда активность вращается, не остановить службу
3) Услуга должна оставаться активной, даже если вы сворачиваете приложение, когда один конкретный фрагмент открыт.
4) Когда действие остановлено (не вращается), и это не определенный фрагмент, остановите службу.
Я начинаю/останавливаю свои услуги в onstart/onstop. В итоге я использовал логическое значение для отслеживания вращения экрана.
Я старт/стоп свои услуги, как это
context.getApplicationContext(). StartService (намерение)
context.getApplicationContext(). StopService (намерение)
Он работал отлично, за исключением для одной ситуации.
Когда вы выключаете экран в ландшафте, Android почему-то решает, что ему нужно воссоздать всю деятельность и называет весь жизненный цикл. Я воспроизвел это в основном приложении на 4.4 и 5.0.1, и это было показано в других потоках, таких как это.
Problems understanding the life cycle when screen goes off and on
Когда он делает это, вращающийся/не вращается нельзя полагаться на, и я предполагаю, что из-за того, как быстро происходили вещи (несколько OnStop/onStarts), это вызывало условия гонки , Когда я вернусь к приложению, иногда он работал, иногда он зависает (нет ошибок), иногда работают две службы.
Это стало кроличьей дырой, где я начал делать чеки, как будто экран был выключен, когда он вошел в onStart, поэтому в следующий раз, когда он был вызван, он знал, что он возвращается с экрана с отдыха, который был помечен (поскольку Android теперь поворачивает его обратно в пейзаж с экрана блокировки портрета). Это становилось нелепым и плохо работало.
Один поток предложил использовать безголовочный фрагмент, чтобы он мог выдержать вращение, но мне все равно нужно его остановить, когда приложение закрыто, поэтому я в конечном итоге застревает с той же проблемой.
Есть ли какие-либо рекомендации по решению этого? Сервис не может оставаться активным, если приложение закрыто (за исключением 1 фрагмента), это будет просто огромная утечка батареи, и ему необходимо пережить поворот или прервать работу.
Это сторонняя библиотека, которая работает с некоторыми аппаратными средствами через Bluetooth. Служба выполняет связь с оборудованием, и на одном конкретном фрагменте она должна оставаться активной. Он также используется в других фрагментах, но это нормально, если он закрыт на этих экранах. – Ben987654
Как бы отключить его? По моему мнению, нет жизненного цикла приложения, только действия. Использование Application.ActivityLifecycleCallbacks все равно будет выведено из жизненного цикла активности, и я столкнулся бы с той же проблемой, когда отключу экран в ландшафтном режиме? – Ben987654
Да, это не идеально. Самый распространенный способ сделать это - следить за тем, сколько действий в настоящее время находится в состоянии возобновления. Это означает, что во всех действиях onPause() и onResume() вы уменьшаете или увеличиваете этот счетчик. Если счетчик равен 0, вы знаете, что приложение находится в фоновом режиме. Примечание. Вероятно, вы захотите добавить задержку для уменьшения счетчика в onPause(), поскольку, конечно, будут времена, когда вы переходите от одного действия к другому (или ориентации переключателя), где действие A будет приостановлено до начала действия B. –