Android Utils- 下載或者上傳操作,判斷手機聯網或者wifi聯網以及網絡是否連接

當我們去下載大文件的時候,最好去判斷當前網絡狀態,提示用戶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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章