Как поддерживать соединение TCP на неопределенный срок?

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

На данный момент у меня есть служба Android с флагом «текущий», поэтому Android не должен ее убивать (по крайней мере, обычными процедурами). Кажется, что служба Android работает нормально и периодически отправляются эхо-запросы. Однако, когда служба запущена на мобильном телефоне (не в эмуляторе) и бездействует, кажется, что Android «замораживает» службу, пока ЦП спит, поэтому отправка эхо-запросов TimerTask перестает работать и соединение разрывается.

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

Я заметил, что AlarmManager может помочь в этой задаче, поэтому я хочу запланировать будильник чтобы обновить запущенную службу, а затем отправить пинг. Это позволит процессору перейти в спящий режим, а также отправит пинг. Но расписание срабатывания будильника каждую минуту может также сильно расходовать заряд батареи или нет?

Я не тестировал этот подход на данный момент, но это возможно? есть ли лучший способ сохранить такое TCP-соединение? Как службы Android, такие как Gmail, решают такие проблемы?

12
задан Alvaro Luis Bustamante 30 July 2011 в 13:38
поделиться