Запуск сервиса Android на бесконечное время - PullRequest
1 голос
/ 13 октября 2011

У меня есть служба определения местоположения, которая работает в фоновом режиме и использует диспетчер расположения для отправки значений lat и long на мой сервер каждые 30 секунд. Я хочу, чтобы эта служба работала бесконечно долго, пока пользователь не остановит службу. Но то, что я наблюдаю, - это то, что через несколько часов сервис исчезает, когда он достигает более 30+ мегабайт. Я хочу знать, как я могу заставить его работать, пока он не остановлен пользователем?

Несколько моих наблюдений (поправьте меня, если я ошибаюсь): В трекере распределения большинство объектов, которые занимают память, являются объектами менеджера местоположения. В куче, когда я вызываю gc, память, выделенная моими объектами, исчезает, и поэтому я предполагаю, что утечки памяти нет. В приложениях -> запущенные службы я не вижу ни одной службы, работающей более 4 часов. Так что я пытаюсь сделать не возможно?

Любая помощь / предложения приветствуются.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 13 октября 2011

Я не уверен, почему ваш сервис начинает занимать более 30 мегабайт, но, возможно, вы как-то теряете память.

В конце концов, ваш дизайн имеет недостатки. Лучшее, что вы можете сделать, это:

  1. Используйте метод PendingIntent registerLocationUpdates для регистрации обновлений местоположения. Вы можете указать minTime между обновлениями здесь.
  2. Если вам нужно отправлять обновления позиции точно каждые 30 секунд, вы также можете зарегистрировать PendingIntent в AlarmManager, чтобы отправлять намерения каждые 30 секунд.
  3. Пусть этот PendingIntent запустит IntentService.
  4. Пусть IntentService отправит данные о местоположении на ваш сервер.
  5. Когда пользователь останавливает ваше приложение, просто отмените регистрацию PendingIntents в LocationManager (и, возможно, в AlarmManager).
1 голос
/ 14 октября 2011

У меня есть служба определения местоположения, которая работает в фоновом режиме и использует менеджер местоположения для отправки значений lat и long на мой сервер каждые 30 секунд.

Пожалуйста, позвольте пользователю выбрать период опроса, включая «никогда не опрашивать».

Также имейте в виду, что это серьезно повлияет на батарею пользователя.

Я хочу, чтобы эта служба работала бесконечно долго, пока пользователь не остановит службу.

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

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

Но то, что я наблюдаю через несколько часов, служба исчезает, когда она достигает более 30+ мегабайт.

Через несколько часов, когда GPS постоянно включен и устройство не активируется, батарея вашего пользователя разряжается, и в этот момент ваш сервис и все остальное исчезают.

Что касается памяти, если вы думаете, что у нее течет память, используйте MAT, чтобы отследить утечки.

0 голосов
/ 13 октября 2011

Почему бы вам не выпустить gc программно - скажем, каждый час?

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

Может быть, на самом деле есть проблема с утечкой памяти?

Предотвращение утечек памяти -Блогентрия может дать некоторые подсказки, может быть.

Возможно, кто-то может дать вам более изощренный совет, если вы дадите нам свой код?

...