代碼分析
ConnectivityManager
packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
許多APN已經棄用,應用層統一用 requestNetwork() 來請求網絡。
![[ConnectivityManager]](https://i-blog.csdnimg.cn/direct/4dc7d31e48b445f2ae5f7adaa76b238b.png)
![[ConnectivityManager] requestNetwork()](https://i-blog.csdnimg.cn/direct/9a5c18a651a24ea5a8a9377046493f7d.png)

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 !=