ConnectivityManager的requestNetwork方法是一个用于请求满足特定条件的网络连接的方法。它通常在应用需要特定类型网络的情况下使用,例如需要大量数据传输时可能会请求一个高带宽的网络。当满足NetworkRequest的条件时,requestNetwork会尝试主动去连接到一个满足条件的网络。
通过ConnectivityManager和通过WifiManager连接网络的区别在于使用的API和功能。
通过ConnectivityManager连接网络是一种更通用的方法,它可以用于获取当前活动的网络连接信息,并可以根据需要切换网络连接。通过ConnectivityManager可以获取到网络的状态、类型、连接状态等信息,可以用于判断当前网络是否可用、判断网络类型(如WiFi、移动数据等)、监听网络连接状态的变化等。
而通过WifiManager连接网络则是针对WiFi网络的连接操作。WifiManager提供了一系列的方法,用于扫描可用的WiFi网络、连接指定的WiFi网络、断开当前连接的WiFi网络等。通过WifiManager可以实现WiFi网络的连接和管理,包括连接到指定的WiFi网络、获取当前连接的WiFi网络信息、获取已保存的WiFi网络列表等。
总结起来,通过ConnectivityManager连接网络更加通用,可以用于判断和管理各种类型的网络连接,而通过WifiManager连接网络则是针对WiFi网络的连接和管理
下面分析ConnectivityManager的requestNetwork方法:
//packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
public class ConnectivityManager {
public void requestNetwork(@NonNull NetworkRequest request,
@NonNull NetworkCallback networkCallback) {
requestNetwork(request, networkCallback, getDefaultHandler());
}
}
调用requestNetwork重载方法:
//packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
public class ConnectivityManager {
public void requestNetwork(@NonNull NetworkRequest request,
@NonNull NetworkCallback networkCallback, @NonNull Handler handler) {
CallbackHandler cbHandler = new CallbackHandler(handler);
NetworkCapabilities nc = request.networkCapabilities;
sendRequestForNetwork(nc, networkCallback, 0, REQUEST, TYPE_NONE, cbHandler);
}
}
调用sendRequestForNetwork方法:
//packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
public class ConnectivityManager {
private NetworkRequest sendRequestForNetwork(NetworkCapabilities need, NetworkCallback callback,
int timeoutMs, NetworkRequest.Type reqType, int legacyType, CallbackHandler handler) {
return sendRequestForNetwork(Process.INVALID_UID, need, callback, timeoutMs, reqType,
legacyType, handler);
}
}
调用sendRequestForNetwork重载方法:
//packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
public class ConnectivityManager {
private final IConnectivityManager mService;
private NetworkRequest sendRequestForNetwork(int asUid, NetworkCapabilities need,
NetworkCallback callback, int timeoutMs, NetworkRequest.Type reqType, int legacyType,
CallbackHandler handler) {
printStackTrace();
checkCallbackNotNull(callback);
if (reqType != TRACK_DEFAULT && reqType != TRACK_SYSTEM_DEFAULT && need == null) {
throw new IllegalArgumentException("null NetworkCapabilities");
}
final NetworkRequest request;
final String callingPackageName = mContext.getOpPackageName();
try {
synchronized(sCallbacks) {
if (callback.networkRequest != null
&& callback.networkRequest != ALREADY_UNREGISTERED) {
// TODO: throw exception instead and enforce 1:1 mapping of callbacks
// and requests (http://b/20701525).
Log.e(TAG, "NetworkCallback was already registered");
}
Messenger messenger = new Messenger(handler);
Binder binder = new Binder();
final int callbackFlags = callback.mFlags;
if (reqType == LISTEN) {
request = mService.listenForNetwork(
need, messenger, binder, callbackFlags, callingPackageName,
getAttributionTag());
} else {
request = mService.requestNetwork(
asUid, need, reqType.ordinal(), messenger, timeoutMs, binder,
legacyType, callbackFlags, callingPackageName, getAttributionTag());
}
if (request != null) {
sCallbacks.put(request, callback);
}
callback.networkRequest = request;

最低0.47元/天 解锁文章
2326






