Как уважать настройки использования сети в 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