TelephonyRegistry
前置文章
前言
在文章《Android无线电信息管理开篇准备工作》中,初步了解 TelephonyRegistry 的作用。顾名思义,TelephonyRegistry 即电话(无线电)注册处(登记处),因此,TelephonyRegistry 的职责是:
- 登记电话(无线电)注册者
- 通知注册者电话(无线电)信息
TelephonyManager&SubscriptionManager
电话相关使用 TelephonyManager
SIM相关使用 SubscriptionManager
在 《Android系统之System Server大纲》一文中,学会了 Android System Server 的架构方式,TelephonyRegistry 作为 server 端,TelephonyManager&SubscriptionManager 则作为 client 端。
在《Android System Server大纲之VibratorService》一文中,清楚的了解到 client 的获取过程以及 getSystemService 返回的本质对象。TelephonyManager 的获取方式是:
TelephoneManager tm = Context.getSystemService(Context.TELEPHONY_SERVICE);
SubscriptionManager sm = Context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)
TelephonyRegistry创建启动
在文章《Android系统之System Server大纲》中,学习了 Android 系统的 System Server 中的 System Service 是如何创建、启动和管理的。
TelephonyRegistry 的启动过程是:
TelephonyRegistry创建代码是:
traceBeginAndSlog("StartTelephonyRegistry");
telephonyRegistry = new TelephonyRegistry(context);
ServiceManager.addService("telephony.registry", telephonyRegistry);
traceEnd();
代码位于文件 frameworks/base/services/java/com/android/server/SystemServer.java 中。
TelephonyRegistry方法集
注意:下面的时序图只针对 2G/3G 网络,暂时不包含 IMS/SIP 的网络
注册接口
//注册用户(SIM)信息变化监听器
params2:回调接口IOnSubscriptionsChangedListener
addOnSubscriptionsChangedListener(String callingPackage,IOnSubscriptionsChangedListener callback):void
//注册无线电业务信息变化监听器
params3:需要监听的事件:
- PhoneStateListener.LISTEN_NONE
- PhoneStateListener.LISTEN_SERVICE_STATE
- …..
listen(pkgForDebug, IPhoneStateListener callback, int events,boolean notifyNow):void
通知变化
//通知呼叫转移变化
notifyCallForwardingChanged(boolean cfi):void
//通知通话状态变化
params1:状态
params2:电话号码
notifyCallState(int state, String incomingNumber):void
//通知通话状态变化
notifyCallStateForPhoneId(int phoneId, int subId, int state,String incomingNumber) {
//通知网络类型变化
notifyCarrierNetworkChange(boolean active)
//通知所有基站(网络)信息
notifyCellInfo(List cellInfo)
//通知所有基站(网络)信息
notifyCellInfoForSubscriber(int subId, List cellInfo)
//通知基站定位信息
notifyCellLocation(Bundle cellLocation)
//通知基站定位信息
notifyCellLocationForSubscriber(int subId, Bundle cellLocation)
//通知数据连接状态
notifyDataActivity(int state)
//通知数据连接状态
notifyDataActivityForSubscriber(int subId, int state)
//通知数据连接已连接
notifyDataConnection(int state, …, int networkType, boolean roaming)
//通知数据连接已连接
notifyDataConnectionForSubscriber(…)
//同时数据连接连接失败
notifyDataConnectionFailed(String reason, String apnType)
//通知通话断开连接(通话结束)
notifyDisconnectCause(int disconnectCause, int preciseDisconnectCause)
//语音信箱通知
notifyMessageWaitingChangedForPhoneId(int phoneId, int subId, boolean mwi)
//通知 OEM hook raw event
notifyOemHookRawEventForSubscriber(int subId, byte[] rawData)
//通知空中业务变化(STK)
notifyOtaspChanged(int otaspMode)
//通知无线电状态变化
notifyServiceStateForPhoneId(int phoneId, int subId, ServiceState state)
//通知无线电信号强度
notifySignalStrengthForPhoneId(int phoneId, int subId,SignalStrength signalStrength)
//通知SIM卡信息变化
notifySubscriptionInfoChanged()
//通知VoLTE(4G通话)网络状态变化
notifyVoLteServiceStateChanged(VoLteServiceState lteState)
//反注册用户(SIM)信息变化监听器
removeOnSubscriptionsChangedListener(String pkgForDebug,IOnSubscriptionsChangedListener callback)
方法集UML模型
addOnSubscriptionsChangedListener
listen
notifyCallForwardingChanged
notifyCallState
notifyCallStateForPhoneId
notifyCarrierNetworkChange
无
notifyCellInfo(ForSubscriber)
notifyCellLocation
notifyDataActivity
notifyDataConnection
notifyDataConnectionFailed
notifyDisconnectCause
notifyMessageWaitingChangedForPhoneId
无
notifyOemHookRawEventForSubscriber
无
notifyOtaspChanged
notifyServiceStateForPhoneId
notifySignalStrengthForPhoneId
类同notifyServiceStateForPhoneId
notifySubscriptionInfoChanged
notifyVoLteServiceStateChanged
无
反注册的问题
通过注册接口listen(pkgForDebug, IPhoneStateListener callback, int events,boolean notifyNow):void,注册无线电业务信息变化监听器时,却没有反注册的接口,那如果不想监听了,怎么办?同样是调用调用注册的接口,但是第三个参数必须传入 PhoneStateListener.LISTEN_NONE 就可以实现反注册。当然,你可以粗暴的把 callback = null 也可以的。
总结
本文深入了解了 TelephonyRegistry 是如果实现无线电和SIM卡信息监听器的登记工作,如何传递无线电和SIM卡信息变化。总体观览 TelephonyRegistry 的所有通知接口,基本上,变化来源是 Phone,因此,TelephonyRegistry 只是做了一个中转站的作用。