代码分析
ConnectivityManager
packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
许多APN已经弃用,应用层统一用 requestNetwork() 来请求网络。
sendRequestForNetwork
此接口是针对“任何类型网络请求”都会执行的公共逻辑,包括 WiFi、Cellular(蜂窝数据)、以太网、有线、蓝牙等。
只负责请求的注册、回调的挂钩、AIDL通信与系统服务托管,并不区分底层是wifi还是cellular。真正的“分配哪个网络(WiFi还是Cellular)”的事,是在系统服务 ConnectivityService(以及更下游的 NetworkAgent、NetworkFactory)里完成判断和分配的。
NetworkCapabilities need 这个参数规定了请求的网络属性和能力,由 ConnectivityService(system service) 进行分配:
- 指定
TRANSPORT_WIFI(只想要WiFi网络,NetworkCapabilities.TRANSPORT_WIFI) - 指定
TRANSPORT_CELLULAR(只想用数据蜂窝,NetworkCapabilities.NET_CAPABILITY_INTERNET) - 可以“都不指定”或者指定多个,系统帮自动选择或监听。
- Android 自 9.0(API 28)起,ConnectivityService/NetworkStack 支持“IP over Bluetooth”(PAN,也叫 Bluetooth tethering 蓝牙网络共享)的情况,可以作为一种网络传输方式存在
- 在
NetworkCapabilities的定义中,TRANSPORT_BLUETOOTH已经是一个合法的 Transport 类型。即——如果有蓝牙 PAN 设备连接,Android 会将其当做一种“有能力提供 IP 网络通信”的链路。
- 在
private NetworkRequest sendRequestForNetwork(int asUid, NetworkCapabilities need,NetworkCallback callback, int timeoutMs, NetworkRequest.Type reqType, int legacyType,CallbackHandler handler) {printStackTrace();checkCallbackNotNull(callback);//非默认跟踪请求,如果没指定网络能力(need)就是非法调用。if (reqType !=