Android 9.0 网络评分之---NetworkFactory

一、网络评分框架图
在这里插入图片描述

二、NetworkFactory 与ConnectivityService连接过程

拿以太网为例,以太网的网口检测类EthernetTracker 会在自己的构造函数中将以太网类型的networkfactory 注册到ConnectivityService中。

EthernetTracker(Context context, Handler handler) {
    mHandler = handler;

    // The services we use.
    IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
    mNMService = INetworkManagementService.Stub.asInterface(b);

    // Interface match regex.
    mIfaceMatch = context.getResources().getString(
            com.android.internal.R.string.config_ethernet_iface_regex);

    // Read default Ethernet interface configuration from resources
    final String[] interfaceConfigs = context.getResources().getStringArray(
            com.android.internal.R.array.config_ethernet_interfaces);
    for (String strConfig : interfaceConfigs) {
        parseEthernetConfig(strConfig);
    }

    mConfigStore = new EthernetConfigStore();

    NetworkCapabilities nc = createNetworkCapabilities(true /* clear default capabilities */);
    mFactory = new EthernetNetworkFactory(handler, context, nc);
    mFactory.register();
}

NetworkFactory 中会的register 方法如下:
public void register() {
if (DBG) log(“Registering NetworkFactory”);
if (mMessenger == null) {
mMessenger = new Messenger(this);
ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG);
}
}

ConnectivityService 中的registerNetworkFactory 方法。会为当前NetworkFactory创建一个NetworkFactoryInfo ,并通过mHandler 发送EVENT_REGISTER_NETWORK_FACTORY

从这里我们看到,在ConnectivityService中,利用当前的NetworkFactory创建NetworkFactoryInfo对象,该对象保存了当前网络连接的name、Messenger对象,并且为其创建了AsyncChannel。 接下来继续看注册过程:
@Override
public void registerNetworkFactory(Messenger messenger, String name) {
enforceConnectivityInternalPermission();
NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
}

NetworkFactoryInfo是ConnectivityService 的一个内部类,会保存当前的NetworkFactory 的messenger和asyncChannel 对象,这里name 就是EthernetNetworkFactory 里面定义的类型NETWORK_TYPE = “Ethernet”
private static class NetworkFactoryInfo {
public final String name;
public final Messenger messenger;
public final AsyncChannel asyncChannel;

    public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) {
        this.name = name;
        this.messenger = messenger;
        this.asyncChannel = asyncChannel;
    }
}

mHandler 是ConnectivityService 的一个内部类 InternalHandler
private class InternalHandler extends Handler {
public InternalHandler(Looper looper) {
super(looper);
}

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case EVENT_REGISTER_NETWORK_FACTORY: {
                handleRegisterNetworkFactory((NetworkFactoryInfo)msg.obj);
                break;
            }

到这里我们发现,ConnectivityService将当前的NetworkFactoryInfo保存到mNetworkFactoryInfos中,然后向当前的NetworkFactory发起AsyncChannel单向通道申请(AsyncChannel相关介绍见这里)。
申请成功时,将会向当前的mTrackerHandler发送CMD_CHANNEL_HALF_CONNECTED消息:
原文链接:https://blog.youkuaiyun.com/u010961631/article/details/48971431
这里面是通过AsyncChannel 让ConnectivityService 的mTrackerHandler 和NetworkFactory连接通信。
三、ConnectivityService 通过AsyncChannel与NetworkFactory 连接的详细过程
AsyncChannel 的客户端(ConnectivityService)发起connect请求,和NetworkFactory连接。所以AsyncChannel 就架起了客户端ConnectivityService 的mTrackerHandler与服务端NetworkFactory之间的桥梁。连接成功后,ConnectivityService会收到AsyncChannel.CMD_CHANNEL_HALF_CONNECTED 的message。当客户端接收到AsyncChannel.CMD_CHANNEL_HALF_CONNECTED消息后,说明当前的单项通道建立成功。此时的客户端可以通过sAsyncChannel的sendMessage()方法向服务端发送消息了。
原文链接:https://blog.youkuaiyun.com/u010961631/article/details/48179305
AsyncChannel 的例子:https://blog.youkuaiyun.com/u010961631/article/details/48179305

作为客户端,如果想要创建与服务端之间的AsyncChannel,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrsongs的心情杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值