NetworkStateTracker.EVENT_RESTORE_DEFAULT_NETWORK,
f), getRestoreDefaultNetworkDelay());
消息发送,问题:消息的Handle函数也在该文件本地,? I、 if ((ni.isConnectedOrConnecting() == true) && !network.isTeardownRequested()) { if (ni.isConnected() == true) { // add the pid-specific dns
Log.d(TAG, \before handleDnsConfigurationChange\
handleDnsConfigurationChange();
if (DBG) Log.d(TAG, \active\
return Phone.APN_ALREADY_ACTIVE; }
if (DBG) Log.d(TAG, \connecting\
return Phone.APN_REQUEST_STARTED; }
这里判断网络是正在连接还是已经连接完成,如果是已经连接完成,就去设置Dns,并返回already状态 J、network.reconnect()
如果网络不是已经连接完成的状态的话,这里触发一个重新连接,直到网络状态变成isConnected; Android MMS 源码流程(二) 2010-06-25 08:21
5) 接下来的操作存在于DataConnectionTracker.java里: public synchronized int enableApnType(String type):
该函数确保用指定的类型连接APN,成功返回APN_ALREADY_ACTIVE或者APN_REQUEST_STARTED
private void setEnabled(int id, boolean enable): 发送EVENT_ENABLE_NEW_APN事件
protected synchronized void onEnableApn(int apnId, int enabled)
该实例主要功能是判断目前是enable还是disable APN,如果是enable的话,调用onEnableNewApn();实现enable APN,如果是disable的话,根据enabledCount,onCleanUpConnection关闭APN或者改为默认连接 6) public void handleMessage(Message msg),ConnectivityService.java里 进入到对事件EVENT_STATE_CHANGED的处理,state= CONNECTED, old= CONNECTING, reason= apnChanged, apnTypeList= mms,应该是最后调用了handleConnect(info);发送一个广播事件
7) MobileDataStateTracker.java:MobileDataStateReceiver类的public void
onReceive(Context context, Intent intent)函数里处理case CONNECTED处理;调用setDetailedState(NetworkStateTracker类实例)发送了
EVENT_STATE_CHANGED事件
8) 然后又跳回ConnectivityService.java里的handleMessage函数EVENT_STATE_CHANGED事件的CONNECTED状态处理 9) handleConnect里最后调用updateNetworkSettings(实现在NetworkStateTracker类里),并发送sendConnectedBroadcast(info);广播事件
10) ConnectivityService.java handleDnsConfigurationChange配置DNS信息,并在handleConnect 函数调用addPrivateDnsRoutes添加路由信息
11) 接下来调用了GpsLocationProvider.java里的updateNetworkState和runLocked,原因不明?
12) 接下来返回去调用startUsingNetworkFeature
(ConnectivityService.java),又一次add dns ?,然后返回APN_ALREADY_ACTIVE状态
13) ensureRouteToHost()(/packages/apps/Mms/src/com/android/mms/transaction/Transaction.java)调用了ConnectivityManager类里的requestRouteToHost 至此关于Mms的Apn网络连接就建立起来了,
下面的步骤是在RILJ层以及RILD层实现数据和AT命令与modem的数据通信,省去
下面分析disable APN的流程,基本上就是Start的反过程:
1) 数据通信完毕,SendTransaction.java里的run函数给出数据通信完成之后的状态
2) stopUsingNetworkFeature()(ConnectivityService实例);这个就是startUsingNetworkFeature的反过程
3) disableApnType(mms),DataConnectionTracker类 4) setEnabled,DataConnectionTracker类
Android平台中Wifi的初始化 收藏 1. WIFI JAVA layer:
1.1 . 当android系统启动WIFI 模块时, 它将调用 Wifiserver 类的setWifiEnabledBlocking函数。
1.2 . 在该函数中,如果是使能WIFI, 它将做四件事: a. load wifi driver. b. 启动wpa_supplicant. c. 启动 event loop. d. 更新wifi的状态.
2. WIFI Native layer: 2.1 . 当java层调用 loadDriver时, 它实际上是通过JNI来调用Native函数, JNI->android_net_wifi_loadDriver -> wifi_load_driver。
在wifi_load_driver函数中,它将首先通过system property -- wlan.driver.status 的状态来判断驱动是否已经加载。如果没有加载,将会加载该驱动。
2.2 . 当java层调用startSupplicant时,它实际上是通过JNI调用到wifi_start_supplicant函数,
在wifi_start_supplicant函数里,首先确定wpa supplicant的配置文件存在,如果不存在,将默认配置文件拷贝到相应目录下,下面是配置文件的默认路径和工作路径: static const char SUPP_CONFIG_TEMPLATE[]= \static const char SUPP_CONFIG_FILE[] = \
然后,调用control_supplicant函数, 如果这时wpa_supplicant还没有启动, 将会启动wpa_supplicant.
2.3 . java层通过connectToSupplicant调用wifi_connect_to_supplicant函数,在该函数中,将通过 wpa_ctrl_open函数分别创建两个AF_UNIX地址族和数据报方式的socket,一个是ctrl_conn, 用于向wpa_supplicant发送命令并接收response, 另一个是monitor_conn, 它一直阻塞等待从wpa_supplicant过来的event。最后,通过monitor_conn向wpa_supplicant发送命令 ATTACH,用于将自己的socket信息注册到wpa_supplicant, 由于socket是数据报方式的,这一步是必须的,对于存在于wpa_supplicant的服务器端,它是所有客户端共享的,由于它需要主动向 monitor_conn客户端发送事件,所以它必须先记录下该客户端的详细信息,wpa_supplicant就可以将EVENT发向该socket。
在完成上面这些操作后,java层会通过jni方式调用函数android_net_wifi_waitForEvent(应该是起一个线程,在线程里调用),该函数会调用wifi_wait_for_event,在wifi_wait_for_event函数里,会阻塞接收从 wpa_supplicant模块传来的事件,一旦wpa_supplicant模块有事件发,wifi_wait_for_event接收到后,会将包含事件的buf通过函数参数的方式回传到java层,java收到事件后,再继续调用wifi_wait_for_event函数进行阻塞等待接收,从而完成一个循环。
2.4 . 以上的流程完成以后,WIFI java layer 调用的WIFI native api 就和wpa_supplicant进程就建立了联系,WIFI java layer就可以向wpa_supplicant发送命令和接收response, 并且wpa_supplicant也可以主动向WIFI java layer发送事件了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhaohc_nj/archive/2010/08/30/5849536.aspx
android 新建一个Apn后的数据连接的调试过程
android, Apn, 数据, 调试
当我新建了一个APN 保存信息后,系统发现APN发生了改变就会去进行数据连接. 我查看调试信息发现第一次发送 setup_data_call 请求后,底层做出了响应,数据连接成功了状态为 CONNECTED, 却出现了PREFERED APN is null, 然后又监听到了 Apn 发生了改变,所以就将状态改变为 DISCONNECTING ,接着就发送一个DEACTIVATE_DATA_CALL 的请求要求断开数据连接,然后又发送一个 setup_data_call 去进行数据连接,第二次就连接成功了并在屏幕上显示出来了 G 标志.
其中让我非常纳闷的是: 为什么检测到两次APN 发生了改变? 当第一次连接状态已经为 CONNECTED 了却又监听到了 APN 发生了改变.
添加APN网络接入点,设置指定网络为默认网络 收藏 网上看了很多资料,再加上自己的理解和探索,终于实现了添加接入点设置和将当前网络设置为自己指定的网络接入点。废话不多说,上源码,大家分享下:(在moto-xt800,CDMA下进行了测试)
1.准备工作:
AndroidManifest。xml文件里添加以下三个权限设置:
android:name=\n> android:name=\ android:name=\ 开始上代码了,很期待吧? 2.新建一个类ApnNode,算是属性设置吧 public class ApnNode { private String name ; private String apn ; private String proxy ; private String port; private String user; private String server; private String password; private String mmsc; private String mmsproxy; private String mmsport; private String mcc; private String mnc; private String numeric; private String type; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the apn */ public String getApn() {