Android App 网络接入实时监控
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 网络接入实时监控相关推荐
- 基于android手机实时监控ipcam视频之一:RTSP
我以前做过一个这样的项目,基于android实现手机实时监控ipcam,ipcam厂商提供控件,该控件安装以后,在IE上面输入ipcam的ip地址,就可以实时查看ipcam的图像,这实时视频是通过HT ...
- Windows平台监控Android App应用
1.adb.exe 原理: adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令 ...
- Android(Linux)实时监控串口数据
之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...
- 流媒体服务器+终端(android,ios,web)来实现实时监控或着说是直播
简介说明: 流媒体服务器+终端(android,ios,web)来实现实时监控或着说是直播 以下几个因素建议考虑 采集.预处理.编码.传输.服务器转码.解码 采集采集是播放环节中的第一环,iOS 系统 ...
- android监控app被杀死,Android App前后台监控
说到App的前后台监控,有什么使用场景呢?例如: IM模块,收到消息时,需要判断当前App是否在前台,如果在前台则震动一下提醒用户,如果在后台则发送一条通知提醒用户. 收到Push推送,需要判断App ...
- android 监控行为,一种针对Android系统App行为的监控方法
主权项: 1.一种针对Android系统App行为的监控方法,通过安全内核实现方法在Android内核层添加模块,实现对整个Android系统的系统调用的拦截与监控:包括如下步骤:S1.编写内核模块: ...
- Android App内截屏监控及涂鸦功能实现
Android App内截屏监控及涂鸦功能实现 Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操 ...
- 【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)
需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.借助摄像头实时检测人脸 与Android自带的人脸检测器相比,OpenCV具备更强劲的人脸识别功能,它可以通过摄像头实时检测人脸,实时检测的预览空 ...
- Android编写一个视频监控App
Android编写一个视频监控App 很久没写app了,小项目需要写一个rtmp拉流的视频监控app,简单记录一下. 参考:Android实现rtmp推拉流摄像头(三)_空空7的博客-CSDN博客_a ...
最新文章
- stream流对象的理解及使用
- 【深度学习】(7) 交叉验证、正则化,自定义网络案例:图片分类,附python完整代码
- 如何使用好android的可访问性服务(Accessibility Services)
- java从尾到头打印链表数据_Java编程实现从尾到头打印链表代码实例
- wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用...
- 通用的Java hashCode重写方案
- 【字符串问题】求一个字符串中重复出现的最长的子串
- oracle 存储过程获取当前日期
- linux kong_当Linux是善良的面Kong
- Iterative learning control for linear discrete delay systems via discrete matrix delayed exponential
- 弘辽科技:直通车总集篇(下篇)
- 项目经理的文档提升能力
- Pandas(数据分析处理库)代码大全
- 渡河问题matlab程序,商人渡河问题(MATLAB版)
- LeetCode算法之蓄水池算法
- 据说深圳电子烟工厂生产了全球产量的90%,为了了解一下这个行业,我做了以下分析
- 国产恒辉数据库CS端管理工具
- 《四世同堂》金句摘抄(十)
- 解决this._data.$$state...“Error: [vuex] do not mutate vuex store state outside mutation handlers.“ 报错
- python爬虫解决中文乱码和爬取美女图片
热门文章
- 计算机网络最突出的优点是a提高可靠性,2013年计算机一级B考试模拟试题十九及答案解析...
- 单片机51测温度c语言,基于51单片机的温度检测及显示设计
- Windows7环境32位操作系统安装Python
- TG Pro for Mac硬度温度检测工具
- 1311_硬件设计_ICT概念、应用以及优缺点学习小结
- Cisco Meraki MX67 MX68 配置网络分公司加入广域网
- 高德发布物流行业LBS解决方案
- 当Android Studio安装时提示couldn‘t detect a java development kit
- STP/RSTP/PVST/MSTP/MSTI/CIST的概念以及Cost of path的计算
- 深度学习入门---《白话机器学习的数学》笔记