彩信流程
- 格式: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) {