MMS业务实现机制分析

彩信收发时网络连接的创建过程

在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()方法中:

Java代码
  1. // Phone.FEATURE_ENABLE_MMS is String "enableMMS"
  2. ConnectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS);
  1. // Phone.FEATURE_ENABLE_MMS is String "enableMMS"
  2. 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()方法中进行注册与解除

Java代码
  1. //注册监听器 in TransactionService.onCreate()
  2. mConnectivityListener = new NetworkConnectivityListener();
  3. mConnectivityListener.registerHandler(mServiceHandler, EVENT_DATA_STATE_CHANGED);
  4. mConnectivityListener.startListening(this);
  1. //注册监听器 in TransactionService.onCreate()
  2. mConnectivityListener = new NetworkConnectivityListener();
  3. mConnectivityListener.registerHandler(mServiceHandler, EVENT_DATA_STATE_CHANGED);
  4. mConnectivityListener.startListening(this);
//注册监听器 in TransactionService.onCreate()
mConnectivityListener = new NetworkConnectivityListener();
mConnectivityListener.registerHandler(mServiceHandler, EVENT_DATA_STATE_CHANGED);
mConnectivityListener.startListening(this);

Java代码
  1. //解除注册监听器 in TransactionService.onDestroy()
  2. mConnectivityListener.unregisterHandler(mServiceHandler);
  3. mConnectivityListener.stopListening();
  4. mConnectivityListener = null;
  1. //解除注册监听器 in TransactionService.onDestroy()
  2. mConnectivityListener.unregisterHandler(mServiceHandler);
  3. mConnectivityListener.stopListening();
  4. 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)”中,并依次进行处理,因此在所有任务处理完成之前保持连接的持续存在是很重要的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值