自:人在码途:
ConnectivityService
描述
Connectivity的核心部分,对ConnectivityManager的实现,实现了IConnectivityManager接口。
在SystemServer的init2中进行初始化,并增加到ServiceManager中。
构造方法
创建单独的thread,进行handler消息处理
创建NetworkFactory,生成各种type的tracker
生成一些default值,比如device name,default dns等
初始化默认优先连接,从Settings.Global.NETWORK_PREFRENCE中读取
从配置文件中读取radio属性和network属性,配置文件在core的string.xml中
创建Tethering共享和Vpn
注册Proxy监听,并加载当前global proxy。Settings.Global.GLOBAL_HTTP_PROXY_PORT中存储相关信息
详细分析
消息处理
- InternalHandler:处理ConnectivityService内部的消息。
- NetworkStateTrackerHandler:传递给每个Tracker,处理每种网络连接的状态变化和配置变化。
enforcePreference
关闭其他connection,条件:
- 不是preference的network
- 正在连接状态的network
- 处于available的network
关闭连接的接口:
netTracker.setTeardownRequested(true);
获取NetworkInfo信息
- 通过getNetworkInfo接口获取。
- 可传递network 的type和用户的uid。
- 默认是当前活动状态的network和调用进程的uid
- 最终通过tracker.getNetworkInfo();返回NetworkInfo
获取LinkProperties
通过tracker.getLinkProperties();来获取
设置radio
通过tracker.setRadio(turnOn)设置
设置mobile data
- 更新变量保存mobile data enable信息
- 更新db保存mobile data enable信息
- 向interal handler发送enable信息
- mNetTrackers[type].setUserDataEnable(enabled);最终设置
Tether共享
最终通过调用Tether.java来出现相关请求
与INetworkPolicy通信
- 实现INetworkPolicyListener
- 注册listener:mPolicyManager.registerListener(mPolicyListener);
发送广播
在handle一些消息后,会发送CONNECTIVITY_ACTION_IMMEDIATE和CONNECTIVITY_ACTION消息