Android網絡連接狀態查詢及事件監聽工具

jopen 11年前發布 | 33K 次閱讀 Android Android開發 移動開發

 最近在項目中,需要檢查終端的網絡連接狀態,及監聽連接狀態變化事件,一切都是為了給用戶更好的體驗,用戶真正會關心的網絡狀態變化事件是“連接(Connected)”和“斷開(Disconnected)”,其他事件是不應該被關注的(都是為了體驗)。

    國內主要是兩種網絡,WIFI和GPRS,所以主要是對這兩個網絡進行查詢,其他沒考慮

    把工具代碼貼一下,有需要的同學可以省點事兒,避免不必要的重復

package org.dragonboy.net;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.support.v4.net.ConnectivityManagerCompat;

/**
 * @author dragonboyorg@qq.com
 */
public class Connectivities {
    private Connectivities() {
    }

    /**
     * 檢查當前WIFI是否連接,兩層意思——是否連接,連接是不是WIFI
     * 
     * @param context
     * @return true表示當前網絡處于連接狀態,且是WIFI,否則返回false
     */
    public static boolean isWifiConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null && info.isConnected()
                && ConnectivityManager.TYPE_WIFI == info.getType()) {
            return true;
        }
        return false;
    }

    /**
     * 檢查當前GPRS是否連接,兩層意思——是否連接,連接是不是GPRS
     * 
     * @param context
     * @return true表示當前網絡處于連接狀態,且是GPRS,否則返回false
     */
    public static boolean isGprsConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null && info.isConnected()
                && ConnectivityManager.TYPE_MOBILE == info.getType()) {
            return true;
        }
        return false;
    }

    /**
     * 檢查當前是否連接
     * 
     * @param context
     * @return true表示當前網絡處于連接狀態,否則返回false
     */
    public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            return true;
        }
        return false;
    }

    /**
     * 對大數據傳輸時,需要調用該方法做出判斷,如果流量敏感,應該提示用戶
     * 
     * @param context
     * @return true表示流量敏感,false表示不敏感
     */
    public static boolean isActiveNetworkMetered(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        return ConnectivityManagerCompat.isActiveNetworkMetered(cm);
    }

    public static Intent registerReceiver(Context context,
            ConnectivityChangeReceiver receiver) {
        return context.registerReceiver(receiver,
                ConnectivityChangeReceiver.FILTER);
    }

    public static void unregisterReceiver(Context context,
            ConnectivityChangeReceiver receiver) {
        context.unregisterReceiver(receiver);
    }

    public static abstract class ConnectivityChangeReceiver extends
            BroadcastReceiver {
        public static final IntentFilter FILTER = new IntentFilter(
                ConnectivityManager.CONNECTIVITY_ACTION);

        @Override
        public final void onReceive(Context context, Intent intent) {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo wifiInfo = cm
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            NetworkInfo gprsInfo = cm
                    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

            // 判斷是否是Connected事件
            boolean wifiConnected = false;
            boolean gprsConnected = false;
            if (wifiInfo != null && wifiInfo.isConnected()) {
                wifiConnected = true;
            }
            if (gprsInfo != null && gprsInfo.isConnected()) {
                gprsConnected = true;
            }
            if (wifiConnected || gprsConnected) {
                onConnected();
                return;
            }

            // 判斷是否是Disconnected事件,注意:處于中間狀態的事件不上報給應用!上報會影響體驗
            boolean wifiDisconnected = false;
            boolean gprsDisconnected = false;
            if (wifiInfo == null || wifiInfo != null
                    && wifiInfo.getState() == State.DISCONNECTED) {
                wifiDisconnected = true;
            }
            if (gprsInfo == null || gprsInfo != null
                    && gprsInfo.getState() == State.DISCONNECTED) {
                gprsDisconnected = true;
            }
            if (wifiDisconnected && gprsDisconnected) {
                onDisconnected();
                return;
            }
        }

        protected abstract void onDisconnected();

        protected abstract void onConnected();
    }
}
來自:http://my.oschina.net/dragonboyorg/blog/160923

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!