当前位置: 首页 > news >正文

Android网络监听

1.通过注册BroadCastReceiver进行网络监听。

        1)  添加网络权限   

 <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

        2)定义BroadCastReceiver     

public class NetworkReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听// 特殊注意:如果if条件生效,那么证明当前是有连接wifi或移动网络的,如果有业务逻辑最好把esle场景酌情考虑进去!if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {//获取联网状态的NetworkInfo对象NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);if (info != null) {//如果当前的网络连接成功并且网络连接可用if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) {Log.e("nyz", getConnectionType(info.getType()) + "已连接");switch (info.getType()) {case ConnectivityManager.TYPE_WIFI:Log.e("nyz", "wifi网络" + "已连接");break;case ConnectivityManager.TYPE_MOBILE:Log.e("nyz", "数据网络" + "已连接");break;}} else {Log.e("nyz", getConnectionType(info.getType()) + "已断开");}} else {Log.e("nyz", "无网络");}}}/*** 获取连接类型** @param type* @return*/private String getConnectionType(int type) {String connType = "";if (type == ConnectivityManager.TYPE_MOBILE) {connType = "3-4G网络数据";} else if (type == ConnectivityManager.TYPE_WIFI) {connType = "WIFI网络";}return connType;}
}

    需要注意的一点是 NetworkInfo 的两个方法:info.isConnected(); info.isAvailable();

    info.isConnected(),不推荐使用 了,推荐的是通过NetWorkCallBack的方式。

    通过这个方法判断网络是否可用是 return mState == State.CONNECTED;

判断的状态,和上面的Receiver中判断的方法是一样的。

  /*** Indicates whether network connectivity exists and it is possible to establish* connections and pass data.* <p>Always call this before attempting to perform data transactions.* @return {@code true} if network connectivity exists, {@code false} otherwise.* @deprecated Apps should instead use the*             {@link android.net.ConnectivityManager.NetworkCallback} API to*             learn about connectivity changes. See*             {@link ConnectivityManager#registerDefaultNetworkCallback} and*             {@link ConnectivityManager#registerNetworkCallback}. These will*             give a more accurate picture of the connectivity state of*             the device and let apps react more easily and quickly to changes.*/@Deprecatedpublic boolean isConnected() {synchronized (this) {return mState == State.CONNECTED;}}

  info.isAvailable(),从AndroidL开始总是返回true,所以用这个方法,不能准确判断,网络是否可用

/***Since Android L, this always returns {@code true}, because the system only* returns info for available networks. */
@Deprecatedpublic boolean isAvailable() {synchronized (this) {return mIsAvailable;}}

3)Activity中注册Receiver,在oDestroy中取消注册。

   private void registerNetWorkReceiver() {//注册网络状态监听广播netWorkReceiver = new NetworkReceiver();IntentFilter filter = new IntentFilter();filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(netWorkReceiver, filter);}@Overrideprotected void onDestroy() {super.onDestroy();if (netWorkReceiver != null) {unregisterReceiver(netWorkReceiver);}}

2.通过CallBack的方式监听网络:

    1)定义NetworkCallbackImpl类,继承ConnectivityManager.NetworkCallback

class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {@Overridepublic void onAvailable(@NonNull Network network) {Log.e("nyz", "网络已连接");}@Overridepublic void onLost(@NonNull Network network) {super.onLost(network);Log.e("nyz", "网络已断开");}@Overridepublic void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {super.onCapabilitiesChanged(network, networkCapabilities);if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {Log.e("nyz", "wifi 网络");} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {Log.e("nyz", "蜂窝网络");} else {Log.e("nyz", "其他网络");}}}

     2)注册CallBack:

        mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkRequest request = new NetworkRequest.Builder().build();networkCallback = new NetworkCallbackImpl();mConnMgr.requestNetwork(request, networkCallback);

   3)反注册:

   @Overrideprotected void onDestroy() {super.onDestroy();mConnMgr.unregisterNetworkCallback(networkCallback);}

3.其他判断网络是否可用的方法:

     

    @SuppressLint("MissingPermission")public static boolean isNetworkAvailable(Context context) {ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connMgr == null) {return false;}NetworkInfo[] infos = connMgr.getAllNetworkInfo();if (infos != null) {for (NetworkInfo info : infos) {if (info.getState() == NetworkInfo.State.CONNECTED) {return true;}}}return false;}

     

   public static boolean isNetConnected(Context context) {if (context != null) {ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();if (mNetworkInfo != null) {return mNetworkInfo.isConnected();}}return false;}

http://www.lryc.cn/news/188802.html

相关文章:

  • Kubernetes 常用命令 持续更新
  • 达梦数据库常用命令行
  • 【通信系列 6 -- AT 命令介绍】
  • flask捕获@app.errorhandler/@app.after_request全局异常总结
  • 智能晾衣架丨以科技解放双手
  • asp.net饭店订餐管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机设计定制
  • Pushgateway的场景使用
  • 时间范围配置(昨天,今天,本周,本月,本季度,本年)
  • PlantUML 绘图
  • spring boot自定义配置时在yml文件输入有提示
  • Linux:I/O 5种模型
  • 企业提升效率的秘密武器,推荐J2L3x聊天软件!
  • Android Termux安装MySQL,并使用cpolar实现公网安全远程连接[内网穿透]
  • 如何有效管理公司分配给员工的个人微信,实现聚合聊天管理?
  • 【HTML5】语义化标签记录
  • 数据结构———— 堆
  • 如何选择专业的游戏开发公司?
  • Unity基础课程之物理引擎3-碰撞检测案例-吃金币并加分显在UI文本框上
  • DAPLink V2 STLink V2 JLink V9.7 串口四合一仿真调试下载器
  • 使用PyTorch处理多维特征输入的完美指南
  • 萝卜刀玩具上架亚马逊CPC认证测试标准
  • 阶段六-Day03-MyBatis
  • 探索RPA流程自动化在不同行业的应用案例
  • 解决gpedit.msc命令无法打开的问题
  • 一大突破!清华大学研制出首颗忆阻器存算一体芯片
  • JUC的线程池架构
  • PostgreSQL limit 语法
  • CUDA C编程权威指南:2.1-CUDA编程模型
  • 两条记录合并成一条记录
  • vue3 + typescript + vite + naive ui + tailwindcss + jsx 仿苹果桌面系统