Обнаружение сетевого подключения на Android?

ОС: Андроид

Дано: пользователь заявил, что хочет оставаться на связи с сервером приложения, чтобы получать обновления и т. д.

Цель: обеспечить подключение пользователей к серверу приложения, даже когда приложение находится в фоновом режиме.

Вопрос: Одной из проблем были случайные отключения от сети. Если пользователь теряет подключение к сети передачи данных (потеря 2G, 3G, WiFi), а затем восстанавливает подключение, наше приложение остается без подключения. В настоящее время я пытаюсь использовать PhoneStateListener для обнаружения различные сетевые изменения и, таким образом, перезапускать соединение с сервером, когда это необходимо. На моем Nexus One (2.1) я обнаружил, что onSignalStrengthsChanged и onDataConnectionStateChanged не вызываются, за исключением случаев, когда слушатели изначально зарегистрированы, но не после этого. Слушатели зарегистрированы внутри службы, поэтому они постоянно прослушивают, пока служба жива (что мы можем предположить как «навсегда» для целей этого вопроса). У кого-нибудь еще были проблемы с прослушиванием состояния подключения к данным?

onServiceStateChanged кажется пока самым надежным, но я хотел знать, добились ли люди успеха и с другими слушателями.


person ChaimKut    schedule 23.02.2011    source источник


Ответы (4)


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

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

person Timo Ohr    schedule 23.02.2011

Поскольку StackOverflow не позволяет мне закрыть вопрос иначе, я дам ответ, почему мои PhoneStateListeners не работали:

Я обнаружил, что моя проблема заключалась просто в том, что я регистрировал своих слушателей не побитовым образом, а скорее последовательно (т.е.
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
telephonyManager.listen(listener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
.
.
.

вместо (правильного):
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE..............);)

Я закрою этот вопрос и, возможно, позже открою другой вопрос с предложением по дизайну для поддержания «всегда активных» подключений к серверу на Android. Спасибо.

person ChaimKut    schedule 23.02.2011

Насколько я знаю, слушатели не могут быть вызваны, когда приложение находится в фоновом режиме. Вы должны попробовать использовать услуги, а не активность.

А также не забудьте правильно получить TelephonyManager

TelephonyManager mTelephonyMgr = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE); 
person noisy    schedule 23.02.2011
comment
Я хотел сказать, что слушатель зарегистрирован внутри службы. Спасибо, что обратили внимание на этот момент. (Вопрос отредактирован). - person ChaimKut; 23.02.2011

Я думаю, вы бы использовали для этого ConnectivityManager.

Класс, отвечающий на запросы о состоянии сетевого подключения. Он также уведомляет приложения об изменении подключения к сети. Получите экземпляр этого класса, вызвав Context.getSystemService(Context.CONNECTIVITY_SERVICE).

http://developer.android.com/reference/android/net/ConnectivityManager.html

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

person jkhouw1    schedule 22.04.2011