【Android】 (九) 网络评分机制

1 WifiNetWorkFactory

WiFi 启动 PHASE_BOOT_COMPLETED 阶段结束后,在 WifiServiceImpl 中 handleBootCompleted 是创建并注册了 WifiNetworkFactory。

WifiNetworkFactory 继承自 NetworkFactoy,NetworkFactory 中定义了 register 方法。

//frameworks/libs/net/common/device/android/net/NetworkFactory.java
public NetworkFactory(Looper looper, Context context, String logTag,
        @Nullable final NetworkCapabilities filter) {
    LOG_TAG = logTag;
    if (isAtLeastS()) {
        mImpl = new NetworkFactoryImpl(this, looper, context, filter);
    } else {
        mImpl = new NetworkFactoryLegacyImpl(this, looper, context, filter);
    }
}
public void register() {
    mImpl.register(LOG_TAG);
}

//frameworks/libs/net/common/device/android/net/NetworkFactoryImpl.java
public void register(final String logTag) {
    register(logTag, false);
}

private void register(final String logTag, final boolean listenToAllRequests) {
    if (mProvider != null) {
        throw new IllegalStateException("A NetworkFactory must only be registered once");
    }
    if (DBG) mParent.log("Registering NetworkFactory");

    mProvider = new NetworkProvider(mContext, NetworkFactoryImpl.this.getLooper(), logTag) {
        @Override
        public void onNetworkRequested(@NonNull NetworkRequest request, int score,
                int servingProviderId) {
            handleAddRequest(request);
        }

        @Override
        public void onNetworkRequestWithdrawn(@NonNull NetworkRequest request) {
            handleRemoveRequest(request);
        }
    };

    ((ConnectivityManager) mContext.getSystemService(
            Context.CONNECTIVITY_SERVICE)).registerNetworkProvider(mProvider);

    // The mScore and mCapabilityFilter members can only be accessed on the handler thread.
    // TODO : offer a separate API to listen to all requests instead
    if (listenToAllRequests) {
        sendMessage(obtainMessage(CMD_LISTEN_TO_ALL_REQUESTS));
    } else {
        sendMessage(obtainMessage(CMD_OFFER_NETWORK));
    }
}

NetworkFactory 中的 register 具体由 NetworkFactoryImpl 实现。所以 register 的具体过程还是得看 NetworkFactoryImpl。首先创建了 NetworkProvider,然后将其注册到 ConnectivityManager 中。ConnectivityManager 将 NetworkProvider 交给 ConnectivityService,ConnectivityService 将之构造成 NetworkProviderInfo,然后向其内部状态机发送一个 EVENT_REGISTER_NETWORK_PROVIDER 消息,来注册这个 NetworkProvider。

接着回到 NetworkFactoryImpl.register 中,传入的 listenToAllRequests 值为 false,所以发送一个 CMD_OFFER_NETWORK 消息,NetworkFactoryImpl 继承自一个 Handler,所以通过 handleMessage 来处理这个消息。找到对应的 case,调用到 handleOfferNetwork。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值