Android13 ConnectivityManager requestNetwork 流程分析

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;
         
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值