首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android - 网络管理分析

2012-08-09 
Android -- 网络管理分析Android -- 网络管理分析在当前网络成为必不可少的条件时,android系统也集成的wif

Android -- 网络管理分析
Android -- 网络管理分析

在当前网络成为必不可少的条件时,android系统也集成的wifi,bluetooth,eth,cablemodem等等,为了将其它网络加入进来,大致浏览一下网络管理的相关分析,重点看了wifi的管理,还是绕了很多弯弯的。


在 ConnectivityManager.java 中定义的有如下类型:
public static final int TYPE_MOBILE      = 0;
public static final int TYPE_WIFI        = 1;
public static final int TYPE_MOBILE_MMS  = 2;
public static final int TYPE_MOBILE_SUPL = 3;
public static final int TYPE_MOBILE_DUN  = 4;
public static final int TYPE_MOBILE_HIPRI = 5;

public static final int TYPE_WIMAX = 6;


/* 这是在机顶盒上为android系统添加的网络类型 */
public static final int TYPE_PPPOE = 7;
public static final int TYPE_ETHERNET = 8;
public static final int TYPE_CABLEMODEM = 9;

public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
设置了默认的网络连接是TYPE_WIFI

而android系统中对众多的网络类型进行管理其整个流程是怎样的呢?下面就来分析一下吧。

系统中对网络的判断和选在是在 ConnectivityService.java 这个服务中来处理的,在系统启动的时候会启动这个系统服务,
而在系统启动完毕后,ConnectivityService在系统启动的时候就启动了。

用户操作的类是 ConnectivityManager.java 通过aidl访问 ConnectivityService.java提供的服务。
public class ConnectivityService extends IConnectivityManager.Stub 
看定义就相当明确了。。

1、网络服务启动
SystemServer启动 ConnectivityService,ConnectivityService 服务中启动对网络的监视器
在SystemServer的run()函数中,启动 ConnectivityService 的代码:

   ConnectivityService 的构造函数会将 WifiService 添加到 ServiceManager 中,使之需要服务者可以访问。


    mWifiStateTracker = new WifiStateTracker(context, handler);
    WifiService wifiService = new WifiService(context, mWifiStateTracker);
    ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
    
WifiStateTracker 会创建 WifiMonitor 接收来自底层的事件,WifiService 和 WifiMonitor 是整个模块的核心。
WifiService 负责启动关闭 wpa_supplicant、启动关闭 WifiMonitor 监视线程
和把命令下发给 wpa_supplicant,而 WifiMonitor 则负责从 wpa_supplicant 接收事件通知。
  
  连接 AP:
1. 使能 WIFI
WirelessSettings 在初始化的时候配置了由 WifiEnabler 来处理 Wifi 按钮,
当用户按下 Wifi 按钮后, Android 会调用 WifiEnabler 的 onPreferenceChange,  
再由 WifiEnabler 调用 WifiManager 的 setWifiEnabled 接口函数,通过 AIDL,实际调用的是 WifiService 的
setWifiEnabled 函数,WifiService 接着向自身发送一条 MESSAGE_ENABLE_WIFI 消息,
在处理该消息的代码中做真正的使能工作:
      case EVENT_DHCP_SUCCEEDED:           mWifiInfo.setIpAddress(mDhcpInfo.ipAddress);           setDetailedState(DetailedState.CONNECTED);           intent =new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);           intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, mNetworkInfo);           mContext.sendStickyBroadcast(intent);           break;


至此为止,整个连接过程完成。


热点排行