主要介绍ServiceStateTracker对ServiceState管理的机制和流程
IMSI(International Mobile Subscriber Identification Number,国际移动用户识别码)
ServiceState:保存SIM卡注册成功后电信运行商网络的一些基本服务信息,关键信息包括:电信运行商编号、Radio无线通信模块使用的技术类型和状态、电信运营商网络是否处于漫游状态、无线网络信号强度等电信服务基本信息;ServiceState服务状态的管理和更新是通过ServiceStateTracker对象完成的,主要维护ServiceState类的ss和newSS两个实体对象,从而完成ServiceState服务状态的管理和更新。
一、ServiceState实体类的关键信息:
1.类的实质
ServiceState类实现了Parcelable[可以了解下原理]接口, 主要有以下两个过程组成:
writeToParcel序列化过程,将对象数据写入外部提供的Parcel中;
createFromParcel反序列化过程,通过外部提供的Parcel获取基本数据来创建数据对象。
2.类的关键常量及属性
ServiceState类的关键常量主要是管理和保存4种服务状态和一些无线通信模块的标准技术。无线通信网络类型覆盖GSM、CDMA和UMTS等全球主流的无线通信技术。
ServiceState类的关键属性定义如下:(Android7.0)
private int mVoiceRegState = STATE_OUT_OF_SERVICE;
private int mDataRegState = STATE_OUT_OF_SERVICE; // 服务状态,0~3共4种状态可选,默认取值为1。
private int mVoiceRoamingType;
private int mDataRoamingType; // 是否进入漫游网络标志
private String mVoiceOperatorAlphaLong; // 电信运营商名称(完整)
private String mVoiceOperatorAlphaShort; // 电信运营商名称(简写)
private String mVoiceOperatorNumeric; // 电信运营商编号
private String mDataOperatorAlphaLong;
private String mDataOperatorAlphaShort;
private String mDataOperatorNumeric;
private boolean mIsManualNetworkSelection; // 手动选择电信运营商标志
private boolean mIsEmergencyOnly; // 仅紧急呼叫标志
3.类的关键方法
主要体现在以下三个方面:
- ServiceState类的序列化和反序列化的过程;
- radioTechnologyToString方法获取手机网络类型对应关系;
- toString方法
二、ServiceStateTracker的运行机制:
android.telephony包路径下定义了ServiceState和SignalStrength两个实体类,这两个类不用区分GSM/CDMA手机网络制式类型;CellLocation抽象类定义在android.telephony包路径下,而在子包gsm和cdma下分别实现了GsmCellLocation和CdmaCellLocation类;com.android.internal.telephony包路径下定义ServiceStateTracker抽象类,同时在子包gsm和cdma下分别继承和实现了GsmServiceStateTracker和CdmaServiceStateTracker类。
ServiceStateTracker类与CallTracker相同,共同继承了Handle类,其实质是自定义的Handle消息处理类,主要两方面的处理逻辑:
- 负责网络服务状态的管理;
- 提供网络服务状态控制的能力。
1.ServiceStateTracker代码结构:
关键属性:
private CommandsInterface mCi; // RIL的Java对象,此对象与GSMPhone对象一样,mCi对象具备与RIL层交互的能力
public ServiceState mSS;
private ServiceState mNewSS;
private SignalStrength mSignalStrength; // 保存手机接入电信运营商无线网络后的信号量
public CellLocation mCellLoc; // 小区信息,国内电信运营商基本没有使用
public CellLocation mNewCellLoc;
private GsmCdmaPhone mPhone; // GSMPhone对象
关键方法: