ConnectivityManager源码分析

先来看一下关于ConnectivityManager类的介绍。

/**
 * Class that answers queries about the state of network connectivity. It also
 * notifies applications when network connectivity changes. Get an instance
 * of this class by calling
 * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}.
 * 

* The primary responsibilities of this class are to: *

    *
  1. Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)
  2. *
  3. Send broadcast intents when network connectivity changes
  4. *
  5. Attempt to "fail over" to another network when connectivity to a network * is lost
  6. *
  7. Provide an API that allows applications to query the coarse-grained or fine-grained * state of the available networks
  8. *
*/
从上面的介绍中总结出该类的作用:

 1.追踪网络的连接状态:WI-Fi,GPRS,UMTS,etc;

 2.当网络状态发生改变时,发送广播sendBroadcast消息;

 3.失效转移file over:当A网络断掉时,系统自动切换,B网络及时补上提供服务,用户不会察觉网络的改变;

 4.提供查询的API:(我们一般使用两种:)连没连网络和连的是什么类型的网络(getNetworkInfo(network_type))。

我们在需要监控网络状态时要注册广播接收器,BroadcastReceiver Action是:

 public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
看下注释
/**
     * A change in network connectivity has occurred. A connection has either
     * been established or lost. The NetworkInfo for the affected network is
     * sent as an extra; it should be consulted to see what kind of
     * connectivity event occurred.
     * 

* If this is a connection that was the result of failing over from a * disconnected network, then the FAILOVER_CONNECTION boolean extra is * set to true. *

* For a loss of connectivity, if the connectivity manager is attempting * to connect (or has already connected) to another network, the * NetworkInfo for the new network is also passed as an extra. This lets * any receivers of the broadcast know that they should not necessarily * tell the user that no data traffic will be possible. Instead, the * receiver should expect another broadcast soon, indicating either that * the failover attempt succeeded (and so there is still overall data * connectivity), or that the failover attempt failed, meaning that all * connectivity has been lost. *

* For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY * is set to {@code true} if there are no connected networks at all. */

从上面我们可以得到系统网络状态广播的情况:

    1.网络的连接与断开

     2.失效转移file over,其对应的标志FAILOVER_CONNECTION=true}

当无网络时,EXTRA_NO_CONNECTIVITY=true。

我们在查询网络状态时经常要区分出网络的类型:


 public static final int TYPE_NONE        = -1;
    public static final int TYPE_MOBILE      = 0;    //基本通话用的网络,譬如3G,GPRS
    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;   //高优先级的移动数据连接。相同的为{TYPE_MOBILE},但路由的设置是不同的。只有请求的进程将有机会获得移动的DNS服务器。
    public static final int TYPE_WIMAX       = 6;    //全球微波互联接入
    public static final int TYPE_BLUETOOTH   = 7;    //蓝牙
    public static final int TYPE_DUMMY       = 8;    //虚拟连接
    public static final int TYPE_ETHERNET    = 9;    //以太网 
    public static final int TYPE_MOBILE_FOTA = 10;
    public static final int TYPE_MOBILE_IMS  = 11;
    public static final int TYPE_MOBILE_CBS  = 12;
    public static final int TYPE_WIFI_P2P    = 13;   //通过wifi直连wifi
    public static final int TYPE_MOBILE_IA = 14;
TYPE_MOBILE_MMS,TYPE_MOBILE_SUPL,TYPE_MOBILE_DUN,TYPE_MOBILE_HIPRI,TYPE_MOBILE_FOTA,TYPE_MOBILE_IMS,TYPE_MOBILE_CBS,TYPE_MOBILE_A是属于MOBILE类型的。

TYPE_WIFI,case TYPE_WIFI_P2P是属于WIFI类型的。

我们在使用getNetworkInfo(networkType)来获得指定网络类型的状态信息。

public NetworkInfo getNetworkInfo(int networkType) {
        try {
            return mService.getNetworkInfo(networkType);
        } catch (RemoteException e) {
            return null;
        }
    }
返回值类型NetworkInfo中可以通过getType()获得的网络类型,可以通过getState()获得网络状态,状态值有下面几个:CONNECTING, CONNECTED, SUSPENDED,

DISCONNECTING, DISCONNECTED, UNKNOWN。



你可能感兴趣的:(Android源码分析)