2011-01-08 3 views
11

Мое приложение выполняет некоторую сборку данных backgound, и я добавляю поддержку сетевых настроек пользователя, например, выполнение обновлений фона и роуминга данных. У меня есть следующие проверки уже:Как уважать настройки использования сети в Android

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() проверяет это для меня. Так есть ли какие-либо другие проверки, которые мне нужно реализовать для сетевых настроек? Что-нибудь еще в этой области я должен знать?

+0

Хороший вопрос. У сетевой информации также нет метода isRoaming. (И вы разрабатываете приложение только для Северной Америки, если это не проблема, поскольку сетевой протокол может быть другим). –

+0

Да, существует метод 'isRoaming()'. Я не использовал его до тех пор, пока 'networkInfo.isAvailable()', похоже, возвращает 'false', если сеть находится в роуминге, и пользователь отключил Data Roaming. Приложение будет только для Великобритании. Я не думаю, что ** это влияет на код, который у меня есть до сих пор, но если бы я должен был выполнить некоторые проверки в ответах, мне пришлось бы проверять другую NETWORK_TYPE , –

+0

Мне было любопытно. Я просмотрел исходный код и документацию. isNetworkAvilable является надежным, как и любой, поскольку он проверяет, находитесь ли вы в домашней сети или нет. (в конце концов, если он терпит неудачу, ваше приложение не единственное в беде;)) –

ответ

6

Пользователь может изменить настройки во время работы фонового приложения. API рекомендует слушать широковещательного сообщения:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

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

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

+0

У меня есть класс, который расширяет 'BroadcastReceiver' для выполнения загрузки. Затем я устанавливаю будильник с помощью «AlarmManager», чтобы вызвать загрузку фона. Каждый раз, когда приемник запускается, он выполняет проверки в моем сообщении. Полагаю, я мог бы также прослушать широковещательное сообщение, которое вы предлагаете, чтобы, если обновления фона были отключены и только что были возвращены, я могу запустить немедленную загрузку. Или я могу просто ждать следующей запланированной загрузки. Думаю, мне нужно принять дизайнерское решение ... спасибо за сообщение. –

6

Дополнительно к чекам я также проверить на роуминг состояния для 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 мобильных сетей.

+0

Интересный подход, спасибо за сообщение. Не будет ли '! M_telephonyManager.isNetworkRoaming()' предотвращать загрузку, даже если пользователь установил флажок, чтобы разрешить роуминг данных? –

+0

Если вы не отметили «Передача данных» в настройках, никто не сможет использовать мобильные сети во время роуминга. Но в моем случае мне нужно было предотвратить интенсивное использование сети, даже если включен роуминг (для «легких» запросов я не выполнял эту проверку роуминга). Таким образом, да, это отключит сетевую активность приложения, даже если включен роуминг на устройствах. – inazaruk

2

Как и @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

Смежные вопросы