2011-01-08 8 views
11

Moja aplikacja wykonuje pewne gromadzenie danych w tle i dodaje obsługę preferencji sieci użytkownika, takich jak wykonywanie aktualizacji w tle i roaming danych. Mam następujące kontrole już:Sposób przestrzegania ustawień korzystania z sieci w Androidzie

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
if(cm.getBackgroundDataSetting()) { 
... 
NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) { 

z wymaganych wpisów w manifeście:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

To wszystko wydaje się działać poprawnie, ale zastanawiałem się, czy powinienem być sprawdzenie czegokolwiek innego? Martwiłem się o sprawdzenie roamingu danych, ale docs stwierdza, że ​​networkInfo.isAvailable() sprawdza to dla mnie. Czy są jakieś inne kontrole, które muszę wprowadzić w celu ustawienia sieci? Coś jeszcze w tym obszarze powinienem być świadomy?

+0

Dobre pytanie. Czy informacje o sieci również nie mają metody isRoaming. (Czy rozwijasz aplikację tylko na obszarze Ameryki Północnej, jeśli nie, może to stanowić problem, ponieważ protokół sieciowy może być inny). –

+0

Tak, istnieje metoda 'isRoaming()'. Nie użyłem go, ponieważ 'networkInfo.isAvailable()' pojawia się zwracając 'false', jeśli sieć jest w roamingu i użytkownik wyłączył Roaming danych. Aplikacja będzie tylko w Wielkiej Brytanii - nie sądzę ** ma to wpływ na dotychczasowy kod, ale jeśli miałbym zaimplementować niektóre kontrole w odpowiedziach, musiałbym sprawdzić inne NETWORK_TYPE . –

+0

Byłem ciekawy. Przeglądałem kod źródłowy i dokumentację. isNetworkAvilable jest niezawodny jak każdy inny, ponieważ sprawdza, czy jesteś w sieci domowej, czy nie. (W końcu, jeśli się nie uda, twoja aplikacja nie jest jedyną, która ma kłopoty;)) –

Odpowiedz

6

Użytkownik może zmienić ustawienia podczas pracy aplikacji w tle. API zaleca odsłuchać wiadomość transmisji:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

Może sprawdzają cm.getBackgroundDataSetting() przed wysłaniem danych i podejrzewam, to byłoby wystarczające. Jednak słuchanie wiadomości umożliwia kontynuowanie wysyłania danych w tle po zmianie ustawień.

Uważam, że wystarczy wysłuchanie wiadomości rozgłoszeniowej lub sprawdzenie ustawień przed wysłaniem danych. Android docs zaleca ten pierwszy.

+0

Mam klasę, która rozszerza 'BroadcastReceiver', aby wykonać pobieranie. Następnie ustawiłem alarm za pomocą 'AlarmManager', aby uruchomić pobieranie w tle. Za każdym razem, gdy odbiornik jest uruchamiany, wykonuje kontrole w moim poście. Przypuszczam, że mógłbym również wysłuchać sugerowanej wiadomości, więc jeśli aktualizacje tła zostały wyłączone i właśnie zostały włączone, mogę uruchomić natychmiastowe pobieranie. Albo mogę po prostu poczekać na następne zaplanowane pobieranie. Chyba muszę podjąć decyzję projektową ... dzięki za post. –

6

Dodatkowo do kontroli również nie sprawdzają za stan roamingu dla sieci 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 
    }  
} 

Moja aplikacja używa dużo danych, więc nie pozwalają na pobieranie danych non-3G sieci komórkowych.

+0

Interesujące podejście, dzięki za post. Czy "! M_telephonyManager.isNetworkRoaming()" nie zapobiegnie pobieraniu, nawet jeśli użytkownik zaznaczył to pole, aby zezwolić na roaming danych? –

+0

Jeśli nie zaznaczyłeś opcji "Dane w roamingu" w ustawieniach, nikt nie będzie mógł korzystać z sieci komórkowych podczas korzystania z roamingu. Ale w moim przypadku musiałem zapobiec intensywnemu korzystaniu z sieci, nawet jeśli włączony jest roaming (dla "lekkich" żądań nie zrobiłem tego czeku roamingowego). Tak, tak, spowoduje to wyłączenie aktywności sieciowej aplikacji, nawet jeśli włączony jest roaming w zakresie urządzeń. – inazaruk

2

Podobnie jak @inazaruk, ja również próbuję zapobiec (dla użytkownika, być może drogim) transferom sieci podczas roamingu lub pobierania obrazów tylko na GPRS. Dlatego w wersji Zwitscher zaimplementowałem program NetworkHelper, który sprawdza preferencje użytkowników dotyczące romaingu i minimalnego stanu sieci; https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/helper/NetworkHelper.java Pasujące ustawienia to: https://github.com/pilhuhn/ZwitscherA/blob/master/res/xml/preferences.xml#L30

Powiązane problemy