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。