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】注册 监听广播事件:
@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判断当前网络是否连接
更多相关文章
- android 实现从网络上抓取图片并显示在手机上
- 为Android、iOS设备搭建模拟丢包、慢速网络模拟环境
- 推荐一款一键切换到无线调试的Android(安卓)Studio插件Android(
- 支付宝登录接入(Android/IOS(swift)/Java后台)
- android的 网络下载和数据持久化
- android手动连接wifi的过程
- Android调用WCFRest
- Android中使用Volley开源库进行Http网络请求(GET方式)
- 伦敦开发者构建了一个基于 Android(安卓)的坦克