Android网络连接网络

Android Connectivity分析(2)- ConnectivityService ConnectivityService 描述 Connectivity的核心部分,对ConnectivityManager的实现,实现了IConnectivityManager接口。 在SystemServer的init2中进行初始化,并增加到ServiceManager中。 构造方法 创建单独的thread,进行handler消息处理 创建NetworkFactory 阅读详情

(1)ConnectivityManager

在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取Connectivity Manager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下:

[java]  view plain copy
  1. String cserviceName = Context.CONNECTIVITY_SERVICE;  
  2. ConnectivityManager cm = (ConnectivityManager) getSystemService(cserviceName);  
要使用Connectivity Manager来读写网络状态时,需要在AndroidManifest.xml文件中加入如下的许可:
[html]  view plain copy
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  2. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>  

Connectivity Manager在较高层面提供了管理可用网络连接的接口,使用getActiveNetworkInfo和getNetworkInfo函数可以查询获取NetworkInfo对象,该对象包含了当前活动网络连接或者指定类型的不可用网络连接的详细信息。

1.1)设置首选网络

当任何认证的应用程序请求网络连接时,Android都会优先尝试使用首选网络连接。设置首选网络连接的函数是setNetworkPreference,代码片段如下:

[java]  view plain copy
  1. cm.setNetworkPreference(ConnectivityManager.TYPE_WIFI);  

当首选网络连接不可用或者连接丢失时,Android将自动尝试使用第二优先连接类型。


1.2)监控网络连接

ConnectivityManager最常用的一个功能就是当网络连接状态改变时通知应用程序,这是通过应用程序实现自己的Broadcast Receiver来监听ConnectivityManager.CONNECTIVITY_ACTION类型的intent来实现的。这个intent提供了以下几种extra来进一步明确发生改变的网络状态:

1)ConnectivityManager.EXTRA_IS_FAILOVER:值为true说明当前的连接是首选网络失效重连后的连接;

2)ConnectivityManager.EXTRA_NO_CONNECTIVITY:值为true表示当前设备没有连接到网络;

3)ConnectivityManager.EXTRA_REASON:如果当前的广播代表网络失效,则这个值包含了连接失效的原因描述;

4)ConnectivityManager.EXTRA_NETWORK_INFO:返回NetworkInfo对象,包含了当前连接事件相关的网络详细信息;

5)ConnectivityManager.EXTRA_OTHER_NETWORK_INFO:在一个网络断开连接时,这个值返回NetworkInfo对象,包含了可能的网络失效重连的详细信息;

6)ConnectivityManager.EXTRA_EXTRA_INFO:包含可选的网络连接的额外信息。


(2)WifiManager

WifiManager代表Android中的Wi-Fi连接服务,它被用于配置Wi-Fi网络连接,管理当前Wi-Fi连接,扫描Wi-Fi接入点和监控Wi-Fi连接的状态改变。获取WifiManager的方法和Connectivity Manager类似,通过函数getSystemService,并提供参数Context.WIFI_SERVICE,代码片段如下:

[java]  view plain copy
  1. String wserviceName = Context.WIFI_SERVICE;  
  2. WifiManager wm = (WifiManager) getSystemService(wserviceName);  

同样的,需要在AndroidManifest.xml文件中指定访问许可:

[html]  view plain copy
  1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  2. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  

我们可以使用setWifiEnabled函数来设置使能和去使能Wi-Fi硬件,使用getWifiState和isWifiEnabled函数来查看当前Wi-Fi状态,代码片段如下:

[java]  view plain copy
  1. if (!wm.isWifiEnabled()) {  
  2.     if (WifiManager.WIFI_STATE_ENABLING != wm.getWifiState()) {  
  3.         wm.setWifiEnabled(true);  
  4.     }  
  5. }  


 

2.1)监控Wi-Fi连接

在Wi-Fi网络连接状态改变时,Wi-Fi Manager将广播相应的intent,有如下几种:

1)WifiManager.WIFI_STATE_CHANGED_ACTION:标识Wi-Fi硬件状态改变,可能在enabling、enabled、disabling、disabled和unknown之间改变。它包含了两个额外的键值EXTRA_WIFI_STATE和EXTRA_PREVIOUS_STATE,分别表示新的和前一个Wi-Fi状态。

2)WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION:Wi-Fi硬件和当前接入点之间的连接状态改变时,这个intent将被广播。额外的键值EXTRA_NEW_STATE用来表示是新的连接建立事件还是已存在的连接中断事件,为true表示新的连接建立。

3)WifiManager.NETWORK_STATE_CHANGED_ACTION:Wi-Fi连接状态改变时广播这个intent,包含两个额外的键值:一是EXTRA_NETWORK_INFO,它包含表示当前网络状态的NetworkInfo对象;一是EXTRA_BSSID,包含连接到的接入点的BSSID值。

4)WifiManager.RSSI_CHANGED_ACTION:监听这个intent可以使应用程序监控当前Wi-Fi连接的信号强度。包含一个额外键值EXTRA_NEW_RSSI,包含了当前信号强度。使用这个信号强度,需要使用静态函数calculateSignalLevel将这个值按指定的缩放转换为整型值。


2.2)创建和管理Wi-Fi连接和配置

使用WiFi Manager可以进行网络配置,控制连接到哪个网络。当连接建立后,可以进一步获取活动网络连接的额外配置信息。使用函数getConfiguredNetworks可获得当前网络配置信息的列表,返回值是WifiConfiguration对象,包含了网络ID、SSID和其他配置信息。

要使用某一网络连接,可使用enableNetwork函数,传入网络ID并设置disableAllOthers参数为true即可,代码片段如下:

[java]  view plain copy
  1. // Get a list of available configurations  
  2. List<WifiConfiguration> configurations = wm.getConfiguredNetworks();  
  3. // Get the network ID for the first one  
  4. if (configurations.size() > 0) {  
  5.     int netID = configurations.get(0).networkId;  
  6.     // Enable the network  
  7.     boolean disableAllOthers = true;  
  8.     wm.enableNetwork(netID, disableAllOthers);  
  9. }  

一旦连接建立,就可以使用getConnectionInfo函数来返回连接的状态,返回的是WifiInfo对象,包含了当前接入点的BSSID、Mac地址、IP地址,以及当前链路速度和信号强度。

下面的代码片段用于查询当前活动Wi-Fi连接并显示获取的相关信息:

[java]  view plain copy
  1. WifiInfo info = wm.getConnectionInfo();  
  2. if (null != info.getBSSID()) {  
  3.     int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);  
  4.     int speed = info.getLinkSpeed();  
  5.     String units = WifiInfo.LINK_SPEED_UNITS;  
  6.     String ssid = info.getSSID();  
  7.               
  8.     String toastText = String.format("Connected to {0} at {1}{2}. Strength {3}/5", ssid, speed, units, strength);  
  9.     Toast.makeText(this.getApplicationContext(), toastText, Toast.LENGTH_LONG);  
  10. }  


2.3)扫描Wifi热点

我们可以使用startScan函数进行Wifi接入点的扫描,当扫描结束且结果可用时,WifiManager将发送SCAN_RESULTS_AVAILABLE_ACTIONL类型的intent。使用getScanResults函数可以获取扫描的结果信息,并保存中ScanResult对象中。ScanResult对象中存放了检测到的每个接入点的详细信息,包括链路速度、信号强度、SSID和支持的认证技术。下面代码片段显示了Wifi热点扫描的过程:

[java]  view plain copy
  1.   // Register a broadcast receiver that listens for scan results  
  2.   registerReceiver(new BroadcastReceiver() {  
  3.   
  4. @Override  
  5. public void onReceive(Context context, Intent intent) {  
  6.     List<ScanResult> results = wifi.getScanResults();  
  7.     ScanResult bestSignal = null;  
  8.     for (ScanResult result : results) {  
  9.         if (null == bestSignal ||  
  10.                 WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) {  
  11.             bestSignal = result;  
  12.         }  
  13.     }  
  14.       
  15.     String toastText = String.format("{0} networks found. {1} is the strongest.",   
  16.             results.size(), bestSignal.SSID);  
  17.     Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG);  
  18. }  
  19.       
  20.   }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));  
  21.     
  22.   //Initiate a scan  
  23.   wifi.startScan();  

要连接到网络,需要创建和注册WiFi配置,通常用户可以使用Android系统原生的WiFi配置程序,但我们也可以在自己的应用程序中提供相同的功能,设置完全替代原生的WiFi配置程序,这就要用到保存网络配置信息的WifiConfiguration类了。每个WiFi配置一般都会包含以下几个公共的数据项:

1)BSSID:指明接入点的BSSID;

2)SSID:某一特定网络的SSID;

3)networkId:用来唯一标识当前设备使用的网络配置的id;

4)priority:选择连接哪个接入点时要使用的每个网络配置的优先权;

5)status:当前网络连接的状态,取值如下:

WifiConfiguration.Status.ENABLED,WifiConfiguration.Status.DISABLED,

WifiConfiguration.Status.CURRENT。

WifiConfiguration对象中还包括支持的认证技术以及用于与接入点进行认证的密钥。

使用addNetwork函数可以将新的WiFi配置添加到当前WiFi列表中,类似的,updateNetwork函数可以用于更新某个已存在的WiFi配置的某些信息;removeNetwork函数用于移除配置信息。要保存网络配置的任何变化,需要调用saveConfiguration函数。

Android Connectivity学习笔记–Bluetooth Android Connectivity学习笔记–Bluetooth 1. 应用场景 设备近距离传递数据的一种方式,无需通过网络连接,节省流量 数据交换方便,理论上可传输任意类型数据 2. 使用流程 (1) 权限声明 首先必须打开的是android.permission.BLUETOOTH权限,如果同时要将此应用做服务端使用(即监听客户端的连接),则同时应打开android.permission.BLUETOOTH_ADMIN权限(一般应用都需要实现这个功能),如下: <uses-permissi 阅读详情

相关推荐

Android Connectivity分析(1)- ConnectivityManager

ConnectivityManager 1.描述 负责监听网络连接的状态,并发送状态变化的广播。想应用提供一些控制接口 作为ConnectivityService的一层包装,实际功能实现在ConnectivityService中。 2.类结构分析   常量定义 intent相关network type定义 静态工具方法 public static String

人在码途 1万+

访问Android硬件资源の管理网络和Wifi连接

(1)ConnectivityManager 在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取ConnectivityManager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下: String cservi...

mmdev 302

告别GUI点点点:Formality形式化验证的TCL脚本自动化实战(附完整脚本)

本文详细介绍了如何通过TCL脚本实现Formality形式化验证的全流程自动化,显著提升验证效率并降低错误率。内容涵盖脚本框架解析、参数化设计、验证报告生成及团队协作策略,特别适合芯片设计工程师摆脱传统GUI操作,实现300%以上的效率提升。

weixin_33737134的博客 282

Android ConnectivityService框架

Android中提供的数据业务方式有几种:移动数据网络,WIFI,热点,网线等。这些数据业务本身可以独立使用,但是同一时刻,只能使用其中的一种数据业务方式。管理这些数据业务方式的使用由ConnectivityService,NetworkFactory,NetworkAgent,NetworkMonitor等来完成,ConnectivityService处于核心调度位置。 Connectivi...

Jimmy的专栏 6908

ERA5数据驱动WRFV4.4实战:单层嵌套配置与关键报错排查指南

本文详细介绍了使用ERA5再分析数据驱动WRFV4.4模式进行单层嵌套模拟的完整实战流程。内容涵盖从数据精准下载、WPS前处理配置、WRF核心参数设置到高频报错的深度排查与解决方案,旨在帮助初学者在有限服务器资源下,高效完成WRF模拟并规避常见陷阱。

q5r6s7的博客 770

标签传播算法LPA:半监督学习解决标注数据不足的完整实战指南

在机器学习实际工程中,标注数据稀缺往往是制约模型性能的核心瓶颈。半监督学习提供了一条利用海量未标注数据来增强模型泛化能力的有效路径,其中标签传播算法(Label Propagation Algorithm, LPA)因其直观的图结构和优雅的数学原理而备受关注。LPA通过将样本映射为图中的节点,以相似度作为边权重,让已知标签沿着图结构不断扩散,从而实现对未知样本的预测。其背后基于聚类假设与流形假设,能在低标注率场景下显著缓解过拟合问题,提升分类准确率。该技术在文本分类、金融风控、图像识别等存在大量无标注数据的

weixin_29056781的博客 239

android打开网络连接失败怎么办,《我叫MT Online》安卓版网络连接失败怎么解决?...

《我叫MT Online》是一款在移动平台上很畅销的游戏,不过有部分安卓版的玩家反映游戏过程中出现网络连接失败的问题,本文将为你分享这一解决方案!注意本教程适用于采用非WIFI状态下连接的朋友,相信不少朋友是采用3G、CMCC以及蜂窝进行游戏登陆。而本教程可以采用win7系统的笔记本,同过自建wifi状态下的虚拟网络来进行游戏的连接。《我叫MT》网络异常解决办法:1.首先确保当你笔记本系统是win...

weixin_42602241的博客 608

基于STM32F103C8T6的红外循迹避障小车

编程思路:控制核心板IO口的电平(即电机驱动模块的AIN1,AIN2,BIN1,BIN2)从而控制AO1、AO2、BO1、BO2的电平高低,进而控制电机使其正转、反转、不转。由于单纯地拉高拉低电平只能让电机在转与不转的状态切换,故决定利用TIM4的两个通道分别产生两路PWM信号来控制电机速度,四个电机两个一组,同一侧的两个连接在同一个PWM上。(#include "dianji.h"文件中同时写了对循迹模块引脚的初始化)

weixin_48743503的博客 1万+

Android Studio创建网络连接工程试验

1 新建工程 File–》new–》project,然后一路next,最后finish即可。 2 Android Studio添加必要的代码和依赖 2.1 AndroidManifest文件 添加了两句网络访问权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.andr...

qionggaobi9328的博客 400

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 328

【软考高项论文】论信息系统项目管理的干系人绩效域

例如,在处理与电信运营商合作铺设光纤网络的问题时,考虑到其在通信设施建设和运维方面的专业性和重要性,我们将之定位为高权力高利益的干系人,给予了高度关注和优先沟通。项目全程,我们对干系人绩效域的执行效果进行了定期检查和评估,通过定量与定性的数据收集,确认了项目在干系人管理上的成效,具体表现为:建立了稳固的工作关系网络,使干系人普遍认可项目目标;鉴于本项目牵涉到政府各级部门、企事业单位、市民团体、技术研发伙伴等多种类型的干系人,且干系人的诉求和影响力各异,因此,有序且持续的干系人参与管理显得尤为关键。

Programming Talk 1681

检测安卓网络连接情况

这是一个函数示例,用来检测安卓网络连接情况,安卓开发人员可参考 原文:检测安卓网络连接情况

F416225054的专栏 646

基于PointNet++网络的点云数据分类仿真分析

局部特征学习模块用于学习点云中每个点的局部特征表示,而全局特征学习模块用于学习整个点云的全局特征表示。点云数据分类是指将点云数据分为不同的类别或标签。PointNet++是一种用于点云数据处理的深度学习网络,它能够有效地学习点云数据的特征表示并实现高精度的分类。在本文中,我们将使用MATLAB实现基于PointNet++网络的点云数据分类仿真分析,并提供相应的源代码。然后,我们使用splitEachLabel函数将数据划分为训练集和测试集,其中80%的数据用于训练,20%的数据用于测试。

HackDashX的博客 210

安卓开发软件中如何检查Android网络连接状态

在发送任何HTTP请求前最好检查下网络连接状态,这样可以避免异常。这个教程将会介绍怎样在你的应用中检测网络连接状态。 创建新的项目 1.在Eclipse IDE中创建一个新的项目并把填入必须的信息。 File->New->Android Project 2.创建新项目后的第一步是要在AndroidManifest.xml文件中添加必要的权限。

JY_Sharer的专栏 1666

NVIDIA Isaac Sim 入门教程(二)

Omniverse Isaac Sim 的工作空间非常容易自定义。调整用户界面的大小、停靠、取消停靠、添加和移除面板都非常容易。进入顶部菜单栏,单击下拉菜单最下方的窗口 > 视口 > 视口 2(现在工作区中应该会出现一个名为 "视口 2 "的新视口。如果您想创建更多的视口,请按照相机检查器扩展进行操作。单击并拖动视口 2 的顶部标题以激活停靠部件。拖放到原始视口的右侧,将两个视口并排放置。单击并向左拖动视口 2 的左侧,使视口大小相等。

机器人控制与仿真应用 6544

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android网络连接

Button1,2的点击:连接到https://www.baidu.com和。

2301_76844045的博客 675

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android网络连接状态,详解android之网络连接的状态

Android开发的时候要连接网络,这个时候需要有相应的权限,下文是爱站技术频道小编搜集的详解android之网络连接的状态,一起跟着爱站技术频道小编的步伐来学习一下吧!复制代码 代码如下:然后,检测网络状态是否可用复制代码 代码如下:/*** 对网络连接状态进行判断* @return true, 可用; false, 不可用*/private boolean isOpenNetwork() {...

weixin_31119637的博客 553

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android网络连接

1.判断网络状态: 开发android app的时候 会涉及到进行网络访问,而我们在进行网络访问同时首先要对网络状态进行检查,以提供给用户必要的提醒。   说明:我们来总结一下,安卓手机管理服务:      1.connectivityManager 管理网络相关连接。connectivity(连通性)。      2.TelephonyManager   管理手机、运营商等相关信息

命里有时终须有,命里无时莫强求 915

Android 网络连接基本方式

就目前我所了解,可以分为两大类,Socket方式 和 Http方式。 其中,Socket方式所需使用的类,及Http方式中HttpUrlConnection类,都是JDK中的java类,跟传统java网络编程无差异。 1.Socket是针对传输层协议的,据说可以支持多种协议,不过java中貌似主要用来进行基于TCP/IP协议的网络编程。 它只是在两个网络进程间建立起稳定点到点连接,可

u013914309的博客 3225

Android检测网络连接

Android检测网络连接 在Android中我们可以用ConnectivityManage来获取网络连接的相关状态; ~获取连接名称 public String getTypeName() 获取连接是否可用 public boolean isAvailable(); 获取连接是否连接 public boolean isConnected(); 获取连接状态 public Sta

qq_29670225的博客 567

Android adb查看网络连接情况

Android 使用adb查看网络使用情况主要的adb命令: adb shell ifconfig //查看配置信息 adb shell dumpsys connectivity //查看连接情况 db shell netstat //查看连接状态和地址 adb shell ip ru //查看路由策略

wenzhi的博客 3万+

探索Gnirehtet:为Android设备提供便捷的反向网络连接

在移动设备日益成为我们生活中心的今天,网络连接的便捷性显得尤为重要。Gnirehtet项目,作为一个开源的反向网络连接工具,为Android设备提供了一种无需root权限的网络共享解决方案。本文将深入介绍Gnirehtet的功能、技术细节、应用场景及其独特之处,帮助您全面了解并考虑是否将其纳入您的技术工具箱。 ## 项目介绍 Gnirehtet(v2.5.1)是一个通过`adb`实现反向网络连...

gitblog_00377的博客 1340

Android中的网络连接

Android中的网络连接​ 如果我们的Android应用需要联网,那么我们就需要一个网络连接专用类。比如我们要访问一个网站,因此我们新建一个名为network的java类。​ network类拥有两个方法,getUrlBytes(String)和getUrlString(String)两个方法。​ getUrlBytes(String)方法从指定的URL获取原始数据并返回一个字节流数组

qq_27572349的博客 566

Android判断网络连接是否可用

ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); //判断网络连接类型,此处为wifi NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); //此处判断...

KieSnow的博客 3412

Android上构建基于httpclient的网络连接池

先上代码: package xiaogang.enif.net; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.KeyStore;

小刚的专栏 6764
上一篇: Android 检查WIFI是否可用的实现方法
下一篇: 记下一个比较特殊的布局用法
爽玩一百天
博客等级 码龄14年 20粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值