0

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

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 фрагмента), это будет просто огромная утечка батареи, и ему необходимо пережить поворот или прервать работу.

ответ

-2

Зачем использовать услугу, если она не работает, когда приложение закрыто? Просто запускайте фоновый поток при запуске приложения и выполняйте свою работу.

UPDATE: Вместо того, чтобы запускать службу из Activity, вы можете запустить ее из своего класса Application (или его потомка). Вы можете остановить его, когда ваше приложение будет подсвечено или убито, а затем запустите его снова, если приложение будет возобновлено.

Самый распространенный способ сделать это - отслеживать, сколько действий в настоящее время находится в состоянии возобновления. Это означает, что в каждом из onPause() и onResume() Activitie вы уменьшаете или увеличиваете этот счетчик. Если счетчик равен 0, вы знаете, что приложение находится в фоновом режиме. Примечание. Вероятно, вы захотите добавить задержку для уменьшения счетчика в onPause(), поскольку, конечно, будут времена, когда вы переходите от одного действия к другому (или ориентации переключателя), где действие A будет приостановлено до начала действия B.

+0

Это сторонняя библиотека, которая работает с некоторыми аппаратными средствами через Bluetooth. Служба выполняет связь с оборудованием, и на одном конкретном фрагменте она должна оставаться активной. Он также используется в других фрагментах, но это нормально, если он закрыт на этих экранах. – Ben987654

+0

Как бы отключить его? По моему мнению, нет жизненного цикла приложения, только действия. Использование Application.ActivityLifecycleCallbacks все равно будет выведено из жизненного цикла активности, и я столкнулся бы с той же проблемой, когда отключу экран в ландшафтном режиме? – Ben987654

+0

Да, это не идеально. Самый распространенный способ сделать это - следить за тем, сколько действий в настоящее время находится в состоянии возобновления. Это означает, что во всех действиях onPause() и onResume() вы уменьшаете или увеличиваете этот счетчик. Если счетчик равен 0, вы знаете, что приложение находится в фоновом режиме. Примечание. Вероятно, вы захотите добавить задержку для уменьшения счетчика в onPause(), поскольку, конечно, будут времена, когда вы переходите от одного действия к другому (или ориентации переключателя), где действие A будет приостановлено до начала действия B. –

 Смежные вопросы

  • Нет связанных вопросов^_^