Как уважать настройки использования сети в Android
Мое приложение выполняет некоторую сборку данных backgound, и я добавляю поддержку настроек сети пользователя, например, выполнение обновлений фона и роуминга данных. У меня уже есть следующие проверки:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(cm.getBackgroundDataSetting()) {
...
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {
с требуемыми записями в манифесте:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Кажется, что все работает нормально, но мне было интересно узнать, нужно ли мне проверять что-нибудь еще? Я беспокоился о проверке роуминга данных, но docs заявил, что networkInfo.isAvailable()
проверяет это для меня. Так есть ли какие-либо другие проверки, которые мне нужно реализовать для сетевых настроек? Что-нибудь еще в этой области я должен знать?
Ответы
Ответ 1
Пользователь может изменить настройки во время работы фонового приложения. API рекомендует прослушивать широковещательное сообщение:
ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED
Возможно, вы проверяете cm.getBackgroundDataSetting() перед отправкой данных, и я подозреваю, что этого будет достаточно. Однако прослушивание широковещательного сообщения позволит вам возобновить отправку фоновых данных при изменении настроек.
Я считаю, что достаточно прослушать широковещательное сообщение или проверить настройки перед отправкой данных. Android docs рекомендует первый.
Ответ 2
Помимо ваших проверок, я также проверяю состояние роуминга для сети 3g:
NetworkInfo info = m_connectivityManager.getActiveNetworkInfo();
int netType = info.getType();
int netSubtype = info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_WIMAX)
{
//no restrictions, do some networking
}
else if (netType == ConnectivityManager.TYPE_MOBILE &&
netSubtype == TelephonyManager.NETWORK_TYPE_UMTS)
{
//3G connection
if(!m_telephonyManager.isNetworkRoaming())
{
//do some networking
}
}
В моем приложении много данных, поэтому я не разрешаю загрузку данных в не-3g мобильных сетях.
Ответ 3
Как и @inazaruk, я также пытаюсь предотвратить (для пользователя, возможно, дорогое) передачу сети при роуминге или загрузке изображений только в GPRS. Поэтому в Zwitscher Я реализовал NetworkHelper, который проверяет предпочтения пользователей при романге и минимальном состоянии сети; https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/helper/NetworkHelper.java
Соответствующие настройки здесь: https://github.com/pilhuhn/ZwitscherA/blob/master/res/xml/preferences.xml#L30