Android 之 网络监控

需求:

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

做法:

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

权限:

<!-- 接入网络权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<!-- 网络监听 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

广播类:

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 {@Overridepublic 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;@Overridepublic void onReceive(Context context, Intent intent) {//Death_Boolean = ping();final Context context1 = context;new Thread(new Runnable() {@Overridepublic 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 App 网络接入实时监控相关推荐

  1. 基于android手机实时监控ipcam视频之一:RTSP

    我以前做过一个这样的项目,基于android实现手机实时监控ipcam,ipcam厂商提供控件,该控件安装以后,在IE上面输入ipcam的ip地址,就可以实时查看ipcam的图像,这实时视频是通过HT ...

  2. Windows平台监控Android App应用

    1.adb.exe 原理: adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令 ...

  3. Android(Linux)实时监控串口数据

    之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...

  4. 流媒体服务器+终端(android,ios,web)来实现实时监控或着说是直播

    简介说明: 流媒体服务器+终端(android,ios,web)来实现实时监控或着说是直播 以下几个因素建议考虑 采集.预处理.编码.传输.服务器转码.解码 采集采集是播放环节中的第一环,iOS 系统 ...

  5. android监控app被杀死,Android App前后台监控

    说到App的前后台监控,有什么使用场景呢?例如: IM模块,收到消息时,需要判断当前App是否在前台,如果在前台则震动一下提醒用户,如果在后台则发送一条通知提醒用户. 收到Push推送,需要判断App ...

  6. android 监控行为,一种针对Android系统App行为的监控方法

    主权项: 1.一种针对Android系统App行为的监控方法,通过安全内核实现方法在Android内核层添加模块,实现对整个Android系统的系统调用的拦截与监控:包括如下步骤:S1.编写内核模块: ...

  7. Android App内截屏监控及涂鸦功能实现

    Android App内截屏监控及涂鸦功能实现 Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操 ...

  8. 【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.借助摄像头实时检测人脸 与Android自带的人脸检测器相比,OpenCV具备更强劲的人脸识别功能,它可以通过摄像头实时检测人脸,实时检测的预览空 ...

  9. Android编写一个视频监控App

    Android编写一个视频监控App 很久没写app了,小项目需要写一个rtmp拉流的视频监控app,简单记录一下. 参考:Android实现rtmp推拉流摄像头(三)_空空7的博客-CSDN博客_a ...

最新文章

  1. stream流对象的理解及使用
  2. 【深度学习】(7) 交叉验证、正则化,自定义网络案例:图片分类,附python完整代码
  3. 如何使用好android的可访问性服务(Accessibility Services)
  4. java从尾到头打印链表数据_Java编程实现从尾到头打印链表代码实例
  5. wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用...
  6. 通用的Java hashCode重写方案
  7. 【字符串问题】求一个字符串中重复出现的最长的子串
  8. oracle 存储过程获取当前日期
  9. linux kong_当Linux是善良的面Kong
  10. Iterative learning control for linear discrete delay systems via discrete matrix delayed exponential
  11. 弘辽科技:直通车总集篇(下篇)
  12. 项目经理的文档提升能力
  13. Pandas(数据分析处理库)代码大全
  14. 渡河问题matlab程序,商人渡河问题(MATLAB版)
  15. LeetCode算法之蓄水池算法
  16. 据说深圳电子烟工厂生产了全球产量的90%,为了了解一下这个行业,我做了以下分析
  17. 国产恒辉数据库CS端管理工具
  18. 《四世同堂》金句摘抄(十)
  19. 解决this._data.$$state...“Error: [vuex] do not mutate vuex store state outside mutation handlers.“ 报错
  20. python爬虫解决中文乱码和爬取美女图片

热门文章

  1. 计算机网络最突出的优点是a提高可靠性,2013年计算机一级B考试模拟试题十九及答案解析...
  2. 单片机51测温度c语言,基于51单片机的温度检测及显示设计
  3. Windows7环境32位操作系统安装Python
  4. TG Pro for Mac硬度温度检测工具
  5. 1311_硬件设计_ICT概念、应用以及优缺点学习小结
  6. Cisco Meraki MX67 MX68 配置网络分公司加入广域网
  7. 高德发布物流行业LBS解决方案
  8. 当Android Studio安装时提示couldn‘t detect a java development kit
  9. STP/RSTP/PVST/MSTP/MSTI/CIST的概念以及Cost of path的计算
  10. 深度学习入门---《白话机器学习的数学》笔记