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】注册 监听广播事件:

 @Overrideprotected void onResume() {        // 网络监听        if (netBroadcastReceiver == null) {            netBroadcastReceiver = new NetBroadcastReceiver();        }        intentFilter = new IntentFilter();        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        registerReceiver( netBroadcastReceiver , intentFilter );        super.onResume(); // 一定要放在后面}@Overrideprotected 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();        }

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

   

注:如果没有网络接入: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判断当前网络是否连接

更多相关文章

  1. android 实现从网络上抓取图片并显示在手机上
  2. 为Android、iOS设备搭建模拟丢包、慢速网络模拟环境
  3. 推荐一款一键切换到无线调试的Android(安卓)Studio插件Android(
  4. 支付宝登录接入(Android/IOS(swift)/Java后台)
  5. android的 网络下载和数据持久化
  6. android手动连接wifi的过程
  7. Android调用WCFRest
  8. Android中使用Volley开源库进行Http网络请求(GET方式)
  9. 伦敦开发者构建了一个基于 Android(安卓)的坦克

随机推荐

  1. Android通过OpenSL ES播放音频套路详解
  2. 【实习周记】Android(安卓)getevent.c源
  3. EditText中android:inputType="number"遇
  4. 【Android】实现动态显示隐藏密码输入框
  5. Android实现数据存储技术
  6. Android(安卓)Menu
  7. android使用HttpClient和URLConnection获
  8. Android(安卓)Otto框架浅析
  9. Flutter之请求权限(适配android)
  10. Android中如何修改系统时间