ConnectivityManager和ConnectivityService讲解
主要作用
- 监听网络连接(WiFi, Cellular等) ;
通过NetworkAgent监听网络连接的变化。NetworkAgent是Bearer和ConnectivityService沟通的桥梁,Bearer通过NetworkAgent将网络信息更新到ConnectivityService中;ConnectivityService通过NetworkAgent给Bearer发送一些控制类的消息等
- 当网络连接发生变化时发送广播通知监听者 ;
发送的广播主要是ConnectivityManager.CONNECTIVITY_ACTION:android.net.conn.CONNECTIVITY_CHANGE
- 当一个网络的连接断开时,尝试打开另外一个网络连接 ;
当NetworkAgent断开/去注册的时候,会rematch network 和 network request,新的network会建立
- 为应用程序查询可用网络状态提供接口 ;
反馈信息最详细的接口是getAllNetworkState,而getAllNetworks,getActiveNetwork相比较算是反馈信息比较粗略的
- 为需要数据业务的应用程序提供请求和选择网络的接口 ;
供应用程序请求网络连接的API是requestNetwork(…)系列,针对不同的应用需求,同名方法有六个
NetworkFactory
主要处理NetworkRequest相关
每个Bearer(cellular, wifi等)都会创建NetworkFactory用来接收ConnectivityService发出来的”scored NetworkRequests”, 所以NetworkFactory会有很多,比如TelephonyNetworkFactory, WifiNetworkFactory和PhoneSwitcher.PhoneSwitcherNetworkRequestListener等
1.将当前网络注册到ConnectivityService;
2.处理网络请求,用于打开或者释放当前连;
3.更新当前网络的分值
NetworkAgent
Bearer和ConnectivityService通信的通道
NetworkAgent是Bearer(cellular,wifi)和ConnectivityService通信的通道,所以会有很多的NetworkAgent,DataConnection.DcNetworkAgent和WifiStateMachine.WifiNetworkAgent等, NetworkAgent是和network对应的,所以如果一个Bearer可以同时支持不同的network((IMS / Internet / MMS Apns on cellular, or perhaps connections with different SSID or P2P for Wi-Fi),那么它可以拥有多个NetworkAgent。作为通信通道,只有那些成功建立通道的NetworkAgent才会在ConnectivityService中保存,那些断开了通道的NetworkAgent会从ConnectivityService中删掉
1.利用NetworkFactory做网络请求是单向的,而NetworkAgent可进行双向通信(如,在EthernetNetworkFactory中的updateAgent);
2.通知ConnectivityService网络状态的变化;
举例总结
发彩信过程中使用mms APN的流程
发彩信需要使用MMS APN,MmsNetworkManager.acquireNetwork会调用ConnectivityManager.requesetNetwork方法请求网络连接;network request会发送到TelephonyNetworkFactory中,TelephonyNetworkFactory会调用DcTracker.requestNetwork,在这个方法中选择合适的ApnContext(MMS),然后开始建立网络连接。
IMS模块通过ConnectivityManger.requestNetwork(…)方法请求使用IMS apn建立data connection