Android 網絡監聽(適配7以上)

 

import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.Build;
import android.telephony.TelephonyManager; 

/**
 * @param
 * @Comments : 功能
 * @Author : Lampo
 * @CreateDate : 2019/10/30 14:28
 * @ModifiedBy : Lampo
 * @ModifiedDate : 2019/10/30 14:28
 * @Modified :
 */

public class CitNetWorkMonitorManager {
    private static CitNetWorkMonitorManager ourInstance;
    private Application application;
    private final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
    private ConnectivityManager connectivityManager;
    private MyBroadcastReceiver receiver;
    public static CitNetWorkMonitorManager getInstance() {
        synchronized (CitNetWorkMonitorManager.class) {
            if (ourInstance == null) {
                ourInstance = new CitNetWorkMonitorManager();
            }
        }
        return ourInstance;
    }
    /**
     * 初始化 傳入application
     *
     * @param application
     */
    public void init(Application application) {
        if (application == null) {
            throw new NullPointerException("application can not be null");
        }
        this.application = application;
        connectivityManager = (ConnectivityManager) this.application.getSystemService(Context.CONNECTIVITY_SERVICE);
    }
    /**
     * 初始化網絡監聽 根據不同版本做不同的處理
     */
    public void register(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 大於21時
            NetworkRequest.Builder builder = new NetworkRequest.Builder();
            NetworkRequest request = builder.build();
            connectivityManager.registerNetworkCallback(request, networkCallback);

        } else {//低版本
            if (receiver == null) receiver = new MyBroadcastReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            this.application.registerReceiver(receiver, intentFilter);
        }
    }
    public void unregister(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 大於21時
            connectivityManager.unregisterNetworkCallback(networkCallback);
        } else {//低版本
            if (receiver != null) {
                this.application.unregisterReceiver(receiver);//註銷廣播
            }
        }
    }
    private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){
        /**
         * 網絡可用的回調連接成功
         */
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            postNetState();
        }
        /**
         * 網絡不可用時調用和onAvailable成對出現
         */
        @Override
        public void onLost(Network network) {
            super.onLost(network);
            postNetState();
        }
    };
    private class  MyBroadcastReceiver extends BroadcastReceiver  {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)) {
                postNetState();
            }
        }
    };
    private void postNetState(){
        //網絡發生變化 沒有網絡-0:WIFI網絡1:4G網絡-4:3G網絡-3:2G網絡-2
        int netType = getAPNType(this.application);
        UtilsManager.isNetAvailable(this.application);
        PDALogger.e("onNetWorkStateChange receiver>>> :" +netType);
        if(netType != 0){
            //當網絡打開,你要處理的事情
            this.application.sendBroadcast(new Intent(Config.REQURSTTIMELOG_UPLOADDATA));
            this.application.sendBroadcast(new Intent(Config.CHANGELINEUPLOADDATA));
        }
    }
    /**
     * 獲取當前的網絡狀態 :沒有網絡-0:WIFI網絡1:4G網絡-4:3G網絡-3:2G網絡-2
     * 自定義
     *
     * @param context
     * @return
     */
    private int getAPNType(Context context) {
        //結果返回值
        int netType = 0;
        //獲取手機所有連接管理對象
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
                .CONNECTIVITY_SERVICE);
        //獲取NetworkInfo對象
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        //NetworkInfo對象爲空 則代表沒有網絡
        if (networkInfo == null) {
            return netType;
        }
        //否則 NetworkInfo對象不爲空 則獲取該networkInfo的類型
        int nType = networkInfo.getType();
        if (nType == ConnectivityManager.TYPE_WIFI) {
            //WIFI
            netType = 1;
        } else if (nType == ConnectivityManager.TYPE_MOBILE) {
            int nSubType = networkInfo.getSubtype();
            TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService
                    (Context.TELEPHONY_SERVICE);
            //3G   聯通的3G爲UMTS或HSDPA 電信的3G爲EVDO
            if (nSubType == TelephonyManager.NETWORK_TYPE_LTE
                    && !telephonyManager.isNetworkRoaming()) {
                netType = 4;
            } else if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS
                    || nSubType == TelephonyManager.NETWORK_TYPE_HSDPA
                    || nSubType == TelephonyManager.NETWORK_TYPE_EVDO_0
                    && !telephonyManager.isNetworkRoaming()) {
                netType = 3;
                //2G 移動和聯通的2G爲GPRS或EGDE,電信的2G爲CDMA
            } else if (nSubType == TelephonyManager.NETWORK_TYPE_GPRS
                    || nSubType == TelephonyManager.NETWORK_TYPE_EDGE
                    || nSubType == TelephonyManager.NETWORK_TYPE_CDMA
                    && !telephonyManager.isNetworkRoaming()) {
                netType = 2;
            } else {
                netType = 2;
            }
        }
        return netType;
    }
}

 

發佈了47 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章