彩信流程

  • 格式:docx
  • 大小:17.20 KB
  • 文档页数:5

数据连接设置为卡1,用卡2发送彩信过程中 APN 切换的流程

TransactionService之前的流程比较简单不在赘述,现在主要理清下从TransactionService到framework的流程。

首先会走到TransactionService的onStartCommand,在此函数中会对当前网络状态进行判断,然后调用到launchTransaction,如果此时网络不可用,会弹出toast,否则就向自己的handler发送EVENT_TRANSACTION_REQUEST。

Handler收到EVENT_TRANSACTION_REQUEST消息后,根据不同的transactionType对data进行不同的处理,我们用的是SEND_TRANSACTION,所以创建了transaction = new

SendTransaction,紧接着调用processTransaction,开始进行transaction。

这里就到了关键的函数----beginMmsConnectivity,会根据此函数的返回值来进行下一步的操作,如果是APN_REQUEST_STARTED,则会把当前的MMS放到等待队列里,直到对应的APNready之后才会发送。

beginMmsConnectivity 会调到connectivityservice的startUsingNetworkFeature,下面重点看下这个函数。

public int startUsingNetworkFeature(int networkType, String feature, // networkType这里我们是0,也就是TYPE_MOBILE,feature 是 enablemms1

IBinder binder) {

…….

if(networkType == ConnectivityManager.TYPE_MOBILE) {

//if type is MMS,continue setup data call

Slog.d(TAG, "if type is MMS,continue setup data call");

if (!getMobileDataEnabledByPhoneId(getPhoneIdByFeature(feature)) &&

!(feature.indexOf(Phone.FEATURE_ENABLE_MMS)!=-1)) {

//if (!getMobileDataEnabledByPhoneId(getPhoneIdByFeature(feature))) {

if (DBG) Slog.d(TAG, "requested special network with data disabled - rejected");

return Phone.APN_TYPE_NOT_AVAILABLE;

} if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DM)) {

usedNetworkType = ConnectivityManager.TYPE_MOBILE_DM;

} else if (TextUtils.equals(feature.substring(0, Phone.FEATURE_ENABLE_MMS.length()),

Phone.FEATURE_ENABLE_MMS)) { //这里判断feature的前几位是不是enablemms

skipAvailableCheck = true;

usedNetworkType =

ConnectivityManager.getMmsTypeByPhoneId(getPhoneIdByFeature(feature));// 将usedNetworkType赋值为11,即TYPE_MOBILE_DM+1

/* yuqing :if send sms with

sim2 ,usedNetworkType=TYPE_MOBILE_DM+1=11 */

} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {

usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL; } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN)) {

usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN;

} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {

usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;

}

}

NetworkStateTracker network = mNetTrackers[usedNetworkType]; //根据usedNetworkType来选取对应的NetworkStateTracker

if (DBG) Slog.d(TAG, "network = " + network);

if (network != null) {

if (usedNetworkType != networkType) { //传入的是0,现在NetworkStateTracker是11

Integer currentPid = new Integer(getCallingPid());

NetworkStateTracker radio = mNetTrackers[networkType];

NetworkInfo ni = network.getNetworkInfo();

// TODO: using serviceState to check is better for Msms

if (!skipAvailableCheck && ni.isAvailable() == false) {

if (DBG) Slog.d(TAG, "special network not available");

return Phone.APN_TYPE_NOT_AVAILABLE;

} synchronized(this) {

mFeatureUsers.add(f);

if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) {

// this gets used for per-pid dns when connected

mNetRequestersPids[usedNetworkType].add(currentPid);

}

}

mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_RESTORE_DEFAULT_NETWORK,

f), getRestoreDefaultNetworkDelay());

if (DBG) Slog.d(TAG, "ni.isConnectedOrConnecting()="+ni.isConnectedOrConnecting());

//当卡2的数据连接还没起来的时候,这里是disconnect

if ((ni.isConnectedOrConnecting() == true) &&

!network.isTeardownRequested()) {

if (ni.isConnected() == true) {

// add the pid-specific dns

handleDnsConfigurationChange(networkType);

if (DBG) Slog.d(TAG, "special network already active");

return Phone.APN_ALREADY_ACTIVE;

}

if (DBG) Slog.d(TAG, "special network already connecting");

return Phone.APN_REQUEST_STARTED; }

// check if the radio in play can make another contact

// assume if cannot for now if (!isAlreadyConnecting) {