Android App 网络接入实时监控

                                      Android 之 网络监控

需求:

     当App打开的时候,加载页面需要网络,但是网络接入和未接入 需要做分别处理。因为如果网络没有接入的话,我们需要给前端页面一张图片。当网络接入的话,我们就是展示我们要展示的内容。其次当我们网络未接入的时候,做类似阅读App的时候,我们是需要从缓存中去取值的,因为这样的话,不影响我们正常的App的使用。比如:小说 缓存之后页面未接入网络,但是页面却要展示内容。

做法:

     我们需要从原始的Android底层封装的类或者接口出发去解决。直接上代码:

权限:





广播类:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;

/**
 * @function 自定义网络触发接入工具
 * @look 当手机网络接入发生改变的时候,进行页面修改或者数据默认值传递
 */
public class NetBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         // 书写 网络判断 代码
    }
}

主类【MainActivity】注册 监听广播事件:

 @Override
protected void onResume() {
        // 网络监听
        if (netBroadcastReceiver == null) {
            netBroadcastReceiver = new NetBroadcastReceiver();
        }
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver( netBroadcastReceiver , intentFilter );
        super.onResume(); // 一定要放在后面
}

@Override
protected void onPause() {
        // 网络注销
        unregisterReceiver( netBroadcastReceiver );
        super.onPause(); // 一定要放在后面
}

注:广播类的注册,注册在那个activity中,那个activity就可以使用广播方法,以及触发广播动作了。

 

因为不同的手机存在不同的网络判断问题,再次推荐几个:

public class NetBroadcastReceiver extends BroadcastReceiver {

    public static boolean Death_Boolean;

    @Override
    public void onReceive(Context context, Intent intent) {
        //Death_Boolean = ping();
        final Context context1 = context;
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        Death_Boolean = ping();
                        // 如果当前没有网络接入
                        if( Death_Boolean == false)
                            Toast.makeText( context1 , "当前无网络接入" , Toast.LENGTH_LONG ).show();
                        // 相关网络接入之后操作 ...
                    }
                }
        ).start();

    }

    public boolean ping() {
        try {
            String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网
            Process p = Runtime.getRuntime().exec("ping -c 1 -w 100 " + ip);// ping网址1次
            if (p.waitFor() == 0)  return true;
        }catch (Exception e) {
        }
        return false;
    }
}

    注:线程的使用,原因是如果放在主线程里面进行ping的话,会造成页面白屏,启动页面刷新延迟等问题。 因为存在网络连接不好判断的情况:模拟器,局域网等等,所以最笨的办法,先写一遍。

 

Android 9.0判断当前网络是否连接

 /**
     * 网络是否已连接
     *
     * @return true:已连接 false:未连接
     */
    @SuppressWarnings("deprecation")
    @RequiresPermission(ACCESS_NETWORK_STATE)
    public static boolean iConnected(@NonNull Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                if (networkCapabilities != null) {
                    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
                }
            } else {
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isConnected();
            }
        }
        return false;
    }

    /**
     * Wifi是否已连接
     *
     * @return true:已连接 false:未连接
     */
    @SuppressWarnings("deprecation")
    public static boolean isWifiConnected(@NonNull Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                if (networkCapabilities != null) {
                    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
                }
            } else {
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
            }
        }
        return false;
    }

    /**
     * 是否为流量
     */
    @SuppressWarnings("deprecation")
    public static boolean isMobileData(@NonNull Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                if (networkCapabilities != null) {
                    return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
                }
            } else {
                NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
            }
        }
        return false;
    }

 

[ API 21以下,6.0-8.0部分手机]

//检测API是不是小于21,因为到了 API21 之后getNetworkInfo(int networkType)方法被弃用
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {

            //获得ConnectivityManager对象
            ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

            //获取ConnectivityManager对象对应的NetworkInfo对象
            //获取WIFI连接的信息
            NetworkInfo wifiNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            //获取移动数据连接的信息
            NetworkInfo dataNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {
                Toast.makeText(context, "WIFI已连接,移动数据已连接", Toast.LENGTH_SHORT).show();
            } else if (wifiNetworkInfo.isConnected() && !dataNetworkInfo.isConnected()) {
                Toast.makeText(context, "WIFI已连接,移动数据已断开", Toast.LENGTH_SHORT).show();
            } else if (!wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {
                Toast.makeText(context, "WIFI已断开,移动数据已连接", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "WIFI已断开,移动数据已断开", Toast.LENGTH_SHORT).show();
            }
//API大于23时使用下面的方式进行网络监听
        }else {
            //获得ConnectivityManager对象
            ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

            //获取所有网络连接的信息
            Network[] networks = connMgr.getAllNetworks();
            //用于存放网络连接信息
            StringBuilder sb = new StringBuilder();
            //通过循环将网络信息逐个取出来
            for (int i=0; i < networks.length; i++){
                //获取ConnectivityManager对象对应的NetworkInfo对象
                NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[i]);
                sb.append(networkInfo.getTypeName() + " connect is " + networkInfo.isConnected());
            }
            Toast.makeText(context, sb.toString(),Toast.LENGTH_SHORT).show();
        }

   因为我是运行过得,运行监测结果:

Android App 网络接入实时监控_第1张图片

   

注:如果没有网络接入:ims(华为)、如果是WIFI:WIFI的名字,其余的移动就是接入的网络比如:cmnet,cmwap

 

附:Android 10.0 暂时不知道,是否特殊判断!!!

 

附【代码参考,运行结果分析等参考资料】:

其中一篇博文:https://blog.csdn.net/qq_40543575/article/details/79666315#commentBox 

                         有关于不同Android API 去获取网络信息

其中一篇博文:https://blog.csdn.net/u014048850/article/details/44599191 

                         有关于:NetWorkInfo(判断网络状况的类) 了解一下。

其中一篇博文:https://www.jianshu.com/p/83725a3125f2

                          有关于:Android 9.0判断当前网络是否连接

你可能感兴趣的:(Android,NetWork)