2011-01-08 64 views
11

我的應用執行一些背景數據收集,並添加對用戶網絡首選項的支持,例如執行後臺更新和數據漫遊。我有以下的檢查已經:如何尊重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方法。 (你是否只開發應用程序到北美地區,如果不是這可能是一個問題,因爲網絡協議可能會不同)。 – 2011-01-28 17:31:18

+0

是的,有一個`isRoaming()`方法。至於networkInfo.isAvailable()`,如果網絡正在漫遊並且用戶已禁用數據漫遊,則似乎還沒有使用它。該應用程序將僅限於英國 - 我不**認爲**這對我迄今爲止的代碼有影響,但如果我要在答案中實現某些檢查,則必須檢查另一個NETWORK_TYPE 。 – 2011-01-28 18:02:18

+0

我很好奇。我瀏覽了源代碼和文檔。 isNetworkAvilable是可靠的,因爲它檢查你是否在家庭網絡中。 (畢竟如果失敗了,你的應用程序不是唯一有問題的人)) – 2011-01-29 01:20:35

回答

6

用戶可以在後臺應用程序運行時更改設置。該API建議您收聽廣播消息:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

也許你正在檢查cm.getBackgroundDataSetting()之前發送的數據,我懷疑這將是足夠的。但是,收聽廣播消息後,您可以在更改設置後繼續發送背景數據。

我相信在發送數據之前收聽廣播消息或檢查設置就足夠了。 Android docs推薦前者。

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移動網絡的數據下載。