編寫:kesenhoo - 原文:http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
重復鬧鐘和后臺服務最常見的功能之一,是用來從網絡上獲取應用更新,存儲數(shù)據或者執(zhí)行大文件的下載。但是如果沒有獲得網絡連接,或者連接的速度太慢以至于下載無法完成,那么就沒有必要喚醒設備并執(zhí)行那些更新等操作了。
我們可以使用ConnectivityManager來檢查設備是否連接到網絡,以及網絡的類型(譯注:通過網絡的連接狀況改變,相應的改變app的行為,減少無謂的操作,從而延長設備的續(xù)航能力)。
如果沒有網絡連接,那么就沒有必要做那些需要聯(lián)網的事情。下面的代碼片段展示了如何通過ConnectivityManager檢查當前活動的網絡類型,并確定它是否可以連接到互聯(lián)網:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
我們還可以獲取到當前的網絡連接類型。
設備通??梢杂幸苿泳W絡,WiMax,Wi-Fi與以太網連接等類型。通過查詢當前活動的網絡類型,可以根據網絡的帶寬對更新頻率進行調整:
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
移動網絡的使用費會比Wi-Fi更高,所以多數(shù)情況下,如果設備正在使用移動網絡,我們應該減少應用的更新頻率;同樣地,還應該臨時地掛起一些文件下載任務直到有Wi-Fi連接時再繼續(xù)下載。
如果已經關閉了更新操作,那么需要監(jiān)聽網絡連接的變化,這樣就可以在建立了互聯(lián)網訪問之后,重新恢復它們。
當網絡連接發(fā)生改變時,ConnectivityManager會廣播CONNECTIVITY_ACTION(android.net.conn.CONNECTIVITY_CHANGE)的Action消息。
我們可以在Manifest文件里面注冊一個BroadcastReceiver,來監(jiān)聽這些變化,并適當?shù)鼗謴停ɑ驋炱穑┠愕暮笈_更新:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
設備的網絡變化可能會比較頻繁,因此每當你在移動網絡與Wi-Fi之間切換的時候,這一廣播就會被觸發(fā)。因此,我們可以僅在之前的更新或者下載任務被掛起的時候去監(jiān)聽這一廣播(用來恢復那些任務)。通常我們可以在開始更新前檢查一下網絡連接,如果當前沒有連接到互聯(lián)網,那么就將更新任務掛起,直到連接恢復。
上述方法會涉及到Broadcast Receiver開啟狀態(tài)的切換,這一內容會在下一節(jié)課中展開。