connectivity manager (封装了ConnectivityService)
ConnectivityManager ConnectivityService in Android
原创
©著作权归作者所有:来自51CTO博客作者meng_xx的原创作品,请联系作者获取转载授权,否则将追究法律责任
管理多种连接方式 mobile/wifi/ether/bt/usb-tether/etc 要新加一个type,需要很复杂的改动(patch)
同一时刻只有一个active的数据连接 见NetworkInfo getActiveNetworkInfo() (也就是说不支持3G wifi同时开着)
(但是,将来很可能会改成支持多个网络同时连接,见:
private static class RadioAttributes {
public int mSimultaneity;
...
)
connection type的优先顺序
ConncectionManager.java 提供了getNetworkPreference setNetworkPreference方法
preference的网络可以是任何type,比如mobile, wifi, bt都可以。
目前preference网络只能有一个 也就是不支持优先级列表,比如最prefer wifi,其次prefer ether,再次prefer mobile 3G
(但是,将来很可能改成支持优先列表,见:
// priority order of the nettrackers
// (excluding dynamically set mNetworkPreference)
// TODO - move mNetworkTypePreference into this
private int[] mPriorityList;、
)
当调用setNetworkPreference时,perfer的网络会被持久化,记录在数据库中
当调用getNetworkPreference时,会从数据库中取回,如果没有记录,就默认wifi
(详见ConnectivityManager.java的hard code : public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;)
这里,只是说优先wifi连接模式,不能设置哪个AP/SSID优先
(AP/SSID优先也能做,另有N种实现方法,都不难)
已经保存了优先网络,如何enforcePreference? todo
当WiFi连上,已经存在的连接(e.g. mobile GPRS,3G,etc)会自动断开 (因为同时不能存在两个active连接)
当离开wifi热点,信号不足时,wifi断开,如仍有数据连接请求,会尝试使用其它连接,如mobile。
这些逻辑保存在ConnectivityService.java中handleConnected handleDisconnect等方法中,未深入研究
network config, radio attribute等配置文件在 /frameworks/base/core/res/res/values/config.xml
(也可针对device定制config.xml,保存在device目录中)
通过读这个文件初始化ConnectivityService的 mNetConfigs mRadioAttributes,见下面xml comments
107 <!-- An Array of "[Connection name],[ConnectivityManager.TYPE_xxxx],
108 [associated radio-type],[priority],[restoral-timer(ms)],[dependencyMet] -->
109 <!-- the 5th element "resore-time" indicates the number of milliseconds to delay
110 before automatically restore the default connection. Set -1 if the connection
111 does not require auto-restore. -->
112 <!-- the 6th element indicates boot-time dependency-met value. -->
113 <string-array translatable="false" name="networkAttributes">
114 <item>"wifi,1,1,1,-1,true"</item>
115 <item>"mobile,0,0,0,-1,true"</item>
116 <item>"mobile_mms,2,0,2,60000,true"</item>
117 <item>"mobile_supl,3,0,2,60000,true"</item>
118 <item>"mobile_hipri,5,0,3,60000,true"</item>
119 <item>"mobile_fota,10,0,2,60000,true"</item>
120 <item>"mobile_ims,11,0,2,60000,true"</item>
121 <item>"mobile_cbs,12,0,2,60000,true"</item>
122 <item>"wifi_p2p,13,1,0,-1,true"</item>
123 </string-array>
...
138 <string-array translatable="false" name="radioAttributes">
139 <item>"1,1"</item>
140 <item>"0,1"</item>
141 </string-array>
另外,ConnectivityService与DNS,×××,Tether,Proxy相关的代码,均未深入研究
ConnectivityManager提供了抽象的连接管理功能,与具体连接物理层无关,
例如wifi的链接管理,需要看 wifi manager/ wifi service , which I did not investigate yet.
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
安卓之热修复的原理以及解决方案
在当今快速迭代的应用开发环境中,热修复技术(Hot Fix)成为了一个重要的工具。特别是在Android平台上,热修复提供了一种在运行时修复应用程序缺陷的方法,而无需重新发布应用程序。本文将深入探讨安卓热修复的原理、解决方案、优缺点以及适用场景。
热修复 Android Tinker AndFix Dexposed