當我們去下載大文件的時候,最好去判斷當前網絡狀態,提示用戶wifi下下載還是數據流量下載,可以增加用戶體驗
// 是否是wifi連接
private static boolean wifiConnected = false;
// 是否是流量連接
private static boolean mobileConnected = false;
// 檢查當前網絡連接狀態,設置wifiConnected 和 mobileConnected
public void updateConnectedFlags() {
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
if (activeInfo != null && activeInfo.isConnected()) {
wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
} else {
wifiConnected = false;
mobileConnected = false;
}
}
//判斷手機是否聯網
public boolean isOnline() {
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
}
廣播動態監聽網絡狀態
public static final String WIFI = "Wi-Fi";
public static final String ANY = "Any";
//用戶選擇在哪個網絡狀態下去下載或者上傳,WIFI下或者任意網絡都可以
public static String sPref = null;
// 是否去下載或者上傳操作
public static boolean refreshDisplay = true;
public class NetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager conn = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = conn.getActiveNetworkInfo();
/*檢查用戶的偏好設置和網絡連接狀態,決定是否去顯示對應的ui,如果偏好設置爲僅限wifi連接,則檢查當前網絡狀態是否爲wifi
*/
if (WIFI.equals(sPref) && networkInfo != null
&& networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
//當前網絡爲wifi連接
refreshDisplay = true;
Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).show();
// 如果設置了任意網絡均可操作執行下載或者上傳操作
} else if (ANY.equals(sPref) && networkInfo != null) {
refreshDisplay = true;
/*以上均不滿足的話,app就不能執行上傳或者下載操作,因爲沒有網絡連接(沒有手機流量和wifi連接,或者是因爲偏好設置是wifi,但是當前網絡不是wifi連接)
*/
} else {
refreshDisplay = false;
Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show();
}
}
}
下載操作的判斷
// The BroadcastReceiver監聽網絡的改變
private NetworkReceiver receiver = new NetworkReceiver();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 註冊BroadcastReceiver 去監聽網絡的改變.
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
receiver = new NetworkReceiver();
this.registerReceiver(receiver, filter);
prepare2Download();
}
@Override
public void onDestroy() {
super.onDestroy();
// 反註冊 BroadcastReceiver 當app被銷燬的時候.
if (receiver != null) {
this.unregisterReceiver(receiver);
}
}
public void prepare2Download() {
/* 可以將設置存儲在緩存中,即SharedPreferences中,然後獲取用戶的操作偏好設置,第二個參數是默認值,如果用戶沒有配置的話,默認是wifi狀態下執行操作
*/
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
sPref = sharedPrefs.getString("Pref", "Wi-Fi");
//檢查當前的網絡狀態
updateConnectedFlags();
//根據當前監聽到的網絡狀態去執行下載或者上傳操作
if(refreshDisplay){
loadPage();
}
}
//判斷當前網絡執行下載操作
public void loadPage() {
if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected))
|| ((sPref.equals(WIFI)) && (wifiConnected))) {
// AsyncTask subclass
new DownloadXmlTask().execute(URL);
} else {
showErrorPage();
}
}
在服務中去配置以上代碼片段,然後在用戶操作上傳或者下載的時候去開啓服務,然後notification顯示進度即可
參考: https://developer.android.google.cn/training/basics/network-ops/managing