系统中对 网络的判断和选择 是在 Connectivityservice这个服务中来处理的,在系统启动的时候会 启动 这个系统服务:
在android内部,用framework/base/core/res/res/values/config.xml中定义了网络的类型:
public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
并设置了默认的网络连接是TYPE_WIFI.
ConnectivityManager的方法是通过AIDL的使用,调用ConnectivityService中的方法来实现的。ConnectivityService继承了IConnectivityManage.stub.
在ConnectivityService内部,定义了两个类来解析xml中的网络类型,
并通过以下代码,来给网络分配优先级,
mPriorityList = new int[naStrings.length];
{
int priority = 0; //lowest
int nextPos = naStrings.length-1;
while (nextPos>-1) {
for (int i = 0; i < mNetAttributes.length; i++) {
if(mNetAttributes[i].mPriority == priority) {
mPriorityList[nextPos--] = i;
}
}
priority++;
}
}
mNetRequestersPids =
new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1];
for (int i=0; i<=ConnectivityManager.MAX_NETWORK_TYPE; i++) {
mNetRequestersPids[i] = new ArrayList();
}


其中,TYPE_MOBILE_HIPRI的优先级最高,其次为TYPE_MOBILE_MMS,TYPE_MOBILE_SUPL,TYPE_MOBILE_DUN, 优先级最低的为TYPE_WIFI,TYPE_MOBILE。在这两个网络类型中,TYPE_WIFI大于TYPE_MOBILE的优先级, 在打开wifi的连接后,mobile网络会被关闭。当wifi网络连接关闭后,mobile网络会重新连接。
在ConnectivityService的构造函数中 启动 网络监视器, 在settings中可以设置网络连接,比如打开wifi,打开bluetooth, 设置apn的连接等等,在设置完成后,设置的消息会存在一个数据库中保存,并发送系统消息来广播网络设置的变化。 在网络监视器中捕捉了settings中发出的相应的网络广播信息, 网络监视器中注册了settings中网络变化的信息,有变化会做相应的处理,并将处理的结果存储在NetworkInfo类的一个对象中,在ConnectivityService中通过 public NetworkInfo getNetworkInfo(int networkType)方法可以得知当前networkType类型网络的连接情况。


在app中,我们可以通过ConnectivityManager来获取当前的网络信息,并能指定当前程序需要的网络类型:
ConnectivityManager mCnn = context.getSystemService(context.NONNECTIVITY_SERVICE);
NetworkInfo mNetinfo = mCnn.getActiveNetworkInfo();
mCnn.setNetworkPreference(int preference);//设定首选网络类型。
假如没有设定,网络类型为系统默认。在wifi,3G网络同时存在的情况下,系统会默认的调用wifi网络,加载wifi的驱动,走wifi网络。

更多相关文章

  1. Android浏览页面时报数据连接性问题
  2. android - JNI接口函数 (3)
  3. Android中Paint字体属性的设置
  4. Android(安卓)Training - 网络操作(1) - 连接网络
  5. Android网络连接1——DefaultHttpClient
  6. 使用HttpURLConnection访问网络
  7. Android网络通信(4):WebKit
  8. Android(安卓)网络框架Volley JAR包生成
  9. Android代码实现WiFi连接

随机推荐

  1. Android中的Binder概述
  2. android 笔记——listView应用
  3. Android 事件触发机制的深入学习
  4. Android绘图之Paint的使用方法详解
  5. 侦听Android手机ServiceState
  6. EditText 各部分颜色设置小结
  7. android视频播放-饺子播放器
  8. Android弹出式窗口PopuWindow的使用
  9. LinearLayout 线性布局属性
  10. 解决style attribute ‘@android:attr/wi