ConnectivityService

管理网络连接的服务层,其中维护了 NetworkAgent 对象列表,每种网络连接都会创建对应的 Agent 用于管理;

NetworkAgent 其实是通过 AsyncChannel 与 ConnectivityService 之间通信的

  • ConnectivityService:handleRegisterNetworkProvider 中参数为 NetworkProviderInfo,其中包含 Messenger 成员,通过其 AsyncChannel 的 connect 连接;
  • ConnectivityService:在 InternalHandler 中处理消息 EVENT_REGISTER_NETWORK_PROVIDER,就是上面的连接过程;
  • ConnectivityService:在 registerNetworkFactory 或者 registerNetworkProvider 中向内部发送了上面的消息,从而触发处理过程;
  • ClientModeImpl:在 registerNetworkFactory 中初始化了 ConnectivityManager 对象 mCm 为 CONNECTIVITY_SERVICE 对象引用,然后调用了 WifiNetworkFactory 对象 mNetworkFactory 的 register 注册,这里 NetworkFactory 是基类,其 register 中创建了 NetworkProvider 对象,并且调用了 CONNECTIVITY_SERVICE 的 registerNetworkProvider 将其注册
    /* Registers this NetworkFactory with the system. May only be called once per factory. */public void register() {if (mProvider != null) {throw new IllegalStateException("A NetworkFactory must only be registered once");}if (DBG) log("Registering NetworkFactory");mProvider = new NetworkProvider(mContext, NetworkFactory.this.getLooper(), LOG_TAG) {@Overridepublic void onNetworkRequested(@NonNull NetworkRequest request, int score,int servingProviderId) {handleAddRequest(request, score, servingProviderId);}@Overridepublic void onNetworkRequestWithdrawn(@NonNull NetworkRequest request) {handleRemoveRequest(request);}};((ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).registerNetworkProvider(mProvider);}
  • ClientModeImpl:在 CMD_BOOT_COMPLETED 消息处理时进行 registerNetworkFactory 操作,最终回归到 ConnectivityService 的 registerNetworkProvider
  • ClientModeImpl:在 handleBootCompleted 中发出 CMD_BOOT_COMPLETED 消息;
  • WifiServiceImpl:在 handleBootCompleted 中调用了 mClientModeImpl.handleBootCompleted(),系统中 SystemService 启动流程中 onBootPhase 调用了每种 Service 的 handleBootCompleted 接口;

进而在 ConnectivityService:handleRegisterNetworkProvider 中 connect 之后调用了 sendAllRequestsToProvider 调用了 NetworkProviderInfo 的 requestNetwork 接口,其实就是通过 AsyncChannel 发送了 CMD_REQUEST_NETWORK 消息;

        void requestNetwork(NetworkRequest request, int score, int servingProviderId) {if (isLegacyNetworkFactory()) {mAsyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,servingProviderId, request);} else {sendMessageToNetworkProvider(NetworkProvider.CMD_REQUEST_NETWORK, score,servingProviderId, request);}}

对 ClientModeImpl 来讲是 WifiNetworkFactory 采用了 AsyncChannel,调用了 handleMessage 进行处理:

    @Overridepublic void handleMessage(Message msg) {switch (msg.what) {case CMD_REQUEST_NETWORK: {handleAddRequest((NetworkRequest) msg.obj, msg.arg1, msg.arg2);break;}case CMD_CANCEL_REQUEST: {handleRemoveRequest((NetworkRequest) msg.obj);break;}case CMD_SET_SCORE: {handleSetScore(msg.arg1);break;}case CMD_SET_FILTER: {handleSetFilter((NetworkCapabilities) msg.obj);break;}}}

其 handleAddRequest 调用了 needNetworkFor 接口,WifiNetworkFactory 重写了该接口,进入了连接和扫描的过程。

在 ClientModeImpl 中 L2ConnectedState 状态下的 enter 过程中创建了 WifiNetworkAgent 对象 mNetworkAgent,通过其 register 接口将 NetworkAgent 对象调用 CONNECTIVITY_SERVICE 服务的 registerNetworkAgent 注册;

registerNetworkAgent 执行了 mDeps.getNetworkStack().makeNetworkMonitor 操作,传入了 NetworkMonitorCallbacks 对象;

在 NetworkStackService 中的 NetworkStackConnector 中执行了 makeNetworkMonitor 操作,解这调用了 INetworkMonitorCallbacks 的 onNetowrkMonitorCreated 接口,传入了新创建的 NetworkMonitorConnector 对象;

在 ConnectivityService 中,NetworkMonitorCallbacks 的 onNetworkMonitorCreated 接口中调用了 mHandler 的 sendMessage 发出了 EVENT_REGISTER_NETWORK_AGENT 消息,触发其中 InternalHandler 的 handleMessage 被调用,从而 调用 handleRegisterNetworkAgent;

handleRegisterNetworkAgent 启动了 NetworkMonitor (NetworkMonitorConnector)状态机,并且调用了 nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger); 进行了 AsyncChannel 的连接,其中 nai 就是上面 registerNetworkAgent 创建的 NetworkAgentInfo 对象,从而连接到对应的 WifiNetworkAgent;

在回过去,这里调用了 updateLinkProperties 更新从 NetworkAgent 发送过来的 LinkProperties 信息;

其处理过程发生在 handleUpdateLinkProperties 接口,是在 maybeHandleNetworkAgentMessage 处理 NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED 消息时调用,而实际上是在 NetworkStateTrackerHandler 类的 handleMessage 处理过程中;

NetworkStateTrackerHandler 在 ConnectivityService 中的对象 mTrackerHandler 在 handleRegisterNetworkProvider 中被用于连接处理 syncChannel 消息,该消息来自 NetworkProvider;

同样它被用来在上面提到的 handleRegisterNetworkAgent 中处理 AsyncChannel 的消息,也就是来自 NetworkAgent 的消息;

在 ClientModeImpl 中 updateLinkProperties 接口调用了 mNetworkAgent 也就是 WifiNetworkAgent 的 sendLinkProperties 接口发送 LinkProperties 用于更新;

前面博文分析过,ClientModeImpl 在 DefaultState 下处理所有的 CMD_UPDATE_LINKPROPERTIES 消息,调用 updateLinkProperties 发出。

Android 网络代理的创建相关推荐

  1. Android网络代理原理及实现

    网络代理简介 代理典型的分为三种类型: 正向代理 缓存服务器使用的代理机制最早是放在客户端一侧的,是代理的原型,称为正向代理.其目的之一 是缓存,另一目的是用来实现防火墙(阻止互联网与公司内网之间的包 ...

  2. Android网络代理终极方案(适用于手机及电视盒子设备)

    adb命令设置全局代理 adb shell settings put global http_proxy ip:port 如: adb shell settings put global http_p ...

  3. 云炬Android开发笔记 5-1,2网络框架接口创建

    1.网络框架接口创建 1.1 使用的是第三方的框架 [第三方框架]Retrofit,封装一个通用的框架,可以使用RxJava和RxAndroid进行封装,比较难,这里不做讲解: 1.2 restful ...

  4. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  5. 【Android】Android网络编程概述

    Android网络编程概述 原文来自:http://blog.csdn.net/kieven2008/article/details/8210737 首先,应该了解的几个问题: 1)Android平台 ...

  6. Android网络编程(八) 之 HttpURLConnection原理分析

    1 使用回顾 我们在前面博文<Android网络编程(四) 之 HttpClient与HttpURLConnection>中已经对HttpURLConnection的使用进行过介绍.今天我 ...

  7. Android网络篇

    http://blog.csdn.net/u011014707/article/details/46584347 针对互联网设计的操作系统,网络编程.多媒体编程.基础框架构成了Android平台应用开 ...

  8. Android网络请求

    1,Android网络编程系列 链接:http://liuwangshu.cn/application/network/1-http.html 1.HTTP简介 HTTP是一个属于应用层的面向对象的协 ...

  9. 从【连接受限】看Android网络

    从连接受限看Android网络 现象 摸索 从通知开始 是Handler发的通知 看看NetworkStateTrackerHandler NetworkMonitor做了什么 NetworkMoni ...

  10. Android网络编程(一)

    Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...

最新文章

  1. 智源出品 | 超大规模智能模型产业发展报告(附下载)
  2. 如何判断当前请求的是健康检查API
  3. QT5开发及实例学习之五算法及正则表达式
  4. 虚拟机安装python3_python3pip在虚拟机中全局安装
  5. conda环境内安装gcc4.8.5(无root权限)
  6. GridView控件属性及应用(转载)
  7. 第一章:恶意软件静态分析基础
  8. html鼠标悬停文字变颜色,鼠标悬停,文字颜色逐渐改变是怎样实现的??
  9. linux ap 模式,无线AP是什么,客户端模式(apclient)是什么意思?
  10. Android经典铃声等等等等,低调而优雅:40 款经典黑莓手机铃声精选(安卓手机适用)...
  11. JAVA学习笔记——BLOB类型和数据批量操作
  12. 微信闪退的修复方法分享
  13. 微软 Visual Studio 2019 正式发布
  14. 【大话数据结构C语言】56 二叉排序树的查找、插入和删除
  15. axure流程图模式_Axure基础教程:产品流程图的制作方法详解
  16. Rust学习日记番外篇——代码写诗
  17. 无线路由器TL-WR703刷Linux操作系统DD-WRT小记(by quqi99)
  18. 许键树:华为云视频直播在各细分场景的体验指标优化实践
  19. linux用什么剪辑视频教程,极简主义:Linux视频剪辑利器Viedo Trimmer
  20. 微信小程序转成uniapp的h5,请求遇到跨域问题

热门文章

  1. Windows批处理(cmd/bat)常用命令小结
  2. phpcms v9框架的目录结构分析
  3. Java入门到精通——工具篇之Maven概述
  4. 使用Redis计数器防止并发请求
  5. 15分钟快速了解如何在Kubernetes中配置健康检查
  6. 浅析 路印协议--Loopring 及整体分析 Relay 源码
  7. android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app
  8. 原生JS实现图片懒加载之一:Element.getBoundingClientRect()
  9. 使用Telnet客户端测试Exchange邮件收发
  10. 【引用】关于close-on-exec标志