1. 程式人生 > >android 全域性網路監聽

android 全域性網路監聽

平常我們在android的頁面要檢測是否有網路,並且還要根據不同的網路來處理相關事務
1.開啟系統廣播監聽

package com.dejun.commonsdk.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import com.dejun.commonsdk.observer.NetChangeObserver;
import com.dejun.commonsdk.util.NetUtils;

import java.util.ArrayList;

/**
 * Author:DoctorWei
 * Time:2018/12/15 9:43
 * Description:
 * email:
[email protected]
*/ public class NetStateReceiver extends BroadcastReceiver { public final static String CUSTOM_ANDROID_NET_CHANGE_ACTION = "com.zhanyun.api.netstatus.CONNECTIVITY_CHANGE"; private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; private static boolean isNetAvailable = false; private static NetUtils.NetType mNetType; private static ArrayList<NetChangeObserver> mNetChangeObservers = new ArrayList<>(); private static BroadcastReceiver mBroadcastReceiver; @Override public void onReceive(Context context, Intent intent) { mBroadcastReceiver = NetStateReceiver.this; if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) { if (!NetUtils.isNetworkAvailable(context)) { isNetAvailable = false; } else { isNetAvailable = true; mNetType = NetUtils.getAPNType(context); } notifyObserver(); } } private void notifyObserver() { if (!mNetChangeObservers.isEmpty()) { int size = mNetChangeObservers.size(); for (int i = 0; i < size; i++) { NetChangeObserver observer = mNetChangeObservers.get(i); if (observer != null) { if (isNetworkAvailable()) { observer.onNetConnected(mNetType); } else { observer.onNetDisConnect(); } } } } } public static boolean isNetworkAvailable() { return isNetAvailable; } /** * 註冊廣播 * * @return */ public static void registerNetworkStateReceiver(Context mContext) { IntentFilter filter = new IntentFilter(); filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION); filter.addAction(ANDROID_NET_CHANGE_ACTION); mContext.getApplicationContext().registerReceiver(getReceiver(), filter); } /** * 銷燬廣播 * * @return */ public static void unRegisterStateReceiver(Context context) { if (mBroadcastReceiver != null) { context.getApplicationContext().unregisterReceiver(mBroadcastReceiver); } } private static BroadcastReceiver getReceiver() { if (mBroadcastReceiver == null) { synchronized (NetStateReceiver.class) { if (mBroadcastReceiver == null) { mBroadcastReceiver = new NetStateReceiver(); } } } return mBroadcastReceiver; } /** * 註冊回撥函式觀察者 */ public static void registerObserver(NetChangeObserver observer) { if (mNetChangeObservers == null) { mNetChangeObservers = new ArrayList<>(); } mNetChangeObservers.add(observer); } /** * 移除監聽 */ public static void removeObserver(NetChangeObserver netChangeObserver) { if (mNetChangeObservers != null) { boolean contains = mNetChangeObservers.contains(netChangeObserver); if (contains) { mNetChangeObservers.remove(netChangeObserver); } } } } 2.獲取網路狀態工具類
package com.dejun.commonsdk.util;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import java.util.Locale;

/**
 * Author:DoctorWei
 * Time:2018/12/14 14:03
 * Description:網路監聽工具類負責實時監聽網路
 * email:[email protected]
 */

public class NetUtils {
    public static enum NetType {
        WIFI, CMNET, CMWAP, NONE
    }

    /**
     * 判斷是否已連線上了網路
     *
     * @param context
     * @return
     */
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] allNetworkInfo = manager.getAllNetworkInfo();//獲取裝置支援的所有網路型別的連結狀態資訊。
        if (allNetworkInfo != null) {
            for (int i = 0; i < allNetworkInfo.length; i++) {
                if (allNetworkInfo[i].getState() == NetworkInfo.State.CONNECTED) {//已連線
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean isNetworkConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (networkInfo != null) {
                return networkInfo.isAvailable();
            }
        }
        return false;
    }

    /**
     * 判斷是否是wifi環境
     *
     * @param context
     * @return
     */
    public static boolean isWifiConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfoWifi = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (networkInfoWifi != null) {
                return networkInfoWifi.isAvailable();
            }
        }
        return false;
    }

    /**
     * 判斷是否是4g環境
     *
     * @param context
     * @return
     */
    public static boolean isMobileConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfoMobile = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (networkInfoMobile != null) {
                return networkInfoMobile.isAvailable();
            }
        }
        return false;
    }

    /**
     * 獲取連線方式
     */
    public static int getConnectedType(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (activeNetworkInfo != null && activeNetworkInfo.isAvailable()) {
                return activeNetworkInfo.getType();
            }
        }
        return -1;
    }

    public static NetType getAPNType(Context context) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
        if (activeNetworkInfo == null) {
            return NetType.NONE;
        }
        int type = activeNetworkInfo.getType();
        if (type==ConnectivityManager.TYPE_MOBILE){
            if (activeNetworkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals("cmnet")){
                return NetType.CMNET;
            }else{
                return NetType.CMWAP;
            }
        }else if (type==ConnectivityManager.TYPE_WIFI){
            return NetType.WIFI;
        }
        return NetType.NONE;

    }
}

3.分別在Apllication中註冊廣播和在baseAcitvity中監聽廣播的的觸發
public class MyApllication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        NetStateReceiver.registerNetworkStateReceiver(this);
    }

public abstract class BaseActivity<V extends BaseView,P extends BasePresenter> extends SupportActivity implements BaseView{
    /**
     * 網路觀察者
     * @param savedInstanceState
     */
    protected NetChangeObserver netChangeObserver;
    @Override
    public void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設定全域性的網路監聽
        netChangeObserver=new NetChangeObserver() {
            @Override
            public void onNetConnected(NetUtils.NetType netType) {
                Logger.d("onNetConnected");
            }

            @Override
            public void onNetDisConnect() {
                Logger.d("onNetDisConnect");
            }
        };
        NetStateReceiver.registerObserver(netChangeObserver);
    
    }

   

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (netChangeObserver!=null) {
            NetStateReceiver.removeObserver(netChangeObserver);
        }
        Logger.d(TAG,"onDestroy");
        if (mPresenter!=null){
            mPresenter.dettachView();
        }
    }

}
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        NetStateReceiver.unRegisterStateReceiver(this);
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}