彩信收发时网络连接的创建过程
在Android系统所在的移动设备上,可以存在多个潜在的网络连接通道,例如:GPRS、Wi-Fi、UMTS等等。对于移动数据网络GPRS而言还有APN的概念。APN(Access Point Name)中文称为“接入点”,它是手机建立无线数据网络连接的必要参数,事实上它就像我们所熟知的代理服务器一样,作为终端访问网络的入口代理而存在。以中国移动的GPRS为例,常用的APN有两种:CMWAP、CMNET。一般情况下各个APN都可能成功发起网络连接,但根据移动网络的运营情况,不同的数据业务在不同的接入点上可能有不同的计费方式。
Android系统中建立网络连接的方法是调用ConnectivityManager工具类的startUsingNetworkFeature()方法,方法执行结果——即连接是否成功建立的状态值,由命名为ConnectivityManager.CONNECTIVITY_ACTION常量的Intent广播消息来通知。
在Messaging应用中,用于建立(收发彩信的)网络连接的代码在TransactionService服务类的beginMmsConnectivity()方法中:
- // Phone.FEATURE_ENABLE_MMS is String "enableMMS"
- ConnectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS);
- // Phone.FEATURE_ENABLE_MMS is String "enableMMS"
- ConnectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS);
// Phone.FEATURE_ENABLE_MMS is String "enableMMS"
ConnectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS);
而用于监听网络连接是否建立成功的监听器,分别在TransactionService.onCreate()和TransactionService.onDestroy()方法中进行注册与解除:
- //注册监听器 in TransactionService.onCreate()
- mConnectivityListener = new NetworkConnectivityListener();
- mConnectivityListener.registerHandler(mServiceHandler, EVENT_DATA_STATE_CHANGED);
- mConnectivityListener.startListening(this);
- //注册监听器 in TransactionService.onCreate()
- mConnectivityListener = new NetworkConnectivityListener();
- mConnectivityListener.registerHandler(mServiceHandler, EVENT_DATA_STATE_CHANGED);
- mConnectivityListener.startListening(this);
//注册监听器 in TransactionService.onCreate()
mConnectivityListener = new NetworkConnectivityListener();
mConnectivityListener.registerHandler(mServiceHandler, EVENT_DATA_STATE_CHANGED);
mConnectivityListener.startListening(this);
- //解除注册监听器 in TransactionService.onDestroy()
- mConnectivityListener.unregisterHandler(mServiceHandler);
- mConnectivityListener.stopListening();
- mConnectivityListener = null;
- //解除注册监听器 in TransactionService.onDestroy()
- mConnectivityListener.unregisterHandler(mServiceHandler);
- mConnectivityListener.stopListening();
- mConnectivityListener = null;
//解除注册监听器 in TransactionService.onDestroy()
mConnectivityListener.unregisterHandler(mServiceHandler);
mConnectivityListener.stopListening();
mConnectivityListener = null;
在当前的SDK中,NetworkConnectivityListener类被@hide了,无法直接访问,阅读其源代码可以知道它创建了一个内置的、用于接收特定广播消息的ConnectivityBroadcastReceiver类,并将网络连接的创建结果封装到NetworkInfo、Reason等属性中,并且它以向mServiceHandler发送特定Message来达到对业务方法的回调效果。
原来在阅读TransactionService类的注释时了解到,MM可以透过mobile data network 和 wi-finetwork两种方式来收发。但阅读具体源码后发现并不是这样,收发彩信的网络连接只能是ConnectivityManager.TYPE_MOBILE类型。
网络连接建立广播最终会转化为mServiceHandler收到的TransactionService.EVENT_DATA_STATE_CHANGED消息,mServiceHandler首先验证连接有效性,再通过sendMessageDelayed()方法建立时间间隔为30秒的计时器,轮询调用beginMmsConnectivity()方法,以保持连接的持续存在。TransactionService把所有信息收发业务置于“任务队列(mProcessing & mPending)”中,并依次进行处理,因此在所有任务处理完成之前保持连接的持续存在是很重要的。