欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TelephonyTesgistry

程序员文章站 2024-03-23 08:31:40
...

TelephonyRegistry

前置文章

  1. Android系统之System Server大纲
  2. Android无线电信息管理开篇准备工作
  3. 初识com.android.phone
  4. PhoneInterfaceManager

前言

在文章《Android无线电信息管理开篇准备工作》中,初步了解 TelephonyRegistry 的作用。顾名思义,TelephonyRegistry 即电话(无线电)注册处(登记处),因此,TelephonyRegistry 的职责是:

  1. 登记电话(无线电)注册者
  2. 通知注册者电话(无线电)信息

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 的启动过程是:

TelephonyTesgistry

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:需要监听的事件:

  1. PhoneStateListener.LISTEN_NONE
  2. PhoneStateListener.LISTEN_SERVICE_STATE
  3. …..

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

TelephonyTesgistry

listen

TelephonyTesgistry

notifyCallForwardingChanged

TelephonyTesgistry

notifyCallState

TelephonyTesgistry

notifyCallStateForPhoneId

TelephonyTesgistry

notifyCarrierNetworkChange

notifyCellInfo(ForSubscriber)

TelephonyTesgistry

notifyCellLocation

TelephonyTesgistry

notifyDataActivity

TelephonyTesgistry

notifyDataConnection

TelephonyTesgistry

notifyDataConnectionFailed

类同notifyDataConnection

notifyDisconnectCause

TelephonyTesgistry

notifyMessageWaitingChangedForPhoneId

notifyOemHookRawEventForSubscriber

notifyOtaspChanged

TelephonyTesgistry

notifyServiceStateForPhoneId

TelephonyTesgistry

notifySignalStrengthForPhoneId

类同notifyServiceStateForPhoneId

notifySubscriptionInfoChanged

TelephonyTesgistry

notifyVoLteServiceStateChanged

反注册的问题

通过注册接口listen(pkgForDebug, IPhoneStateListener callback, int events,boolean notifyNow):void,注册无线电业务信息变化监听器时,却没有反注册的接口,那如果不想监听了,怎么办?同样是调用调用注册的接口,但是第三个参数必须传入 PhoneStateListener.LISTEN_NONE 就可以实现反注册。当然,你可以粗暴的把 callback = null 也可以的。

总结

本文深入了解了 TelephonyRegistry 是如果实现无线电和SIM卡信息监听器的登记工作,如何传递无线电和SIM卡信息变化。总体观览 TelephonyRegistry 的所有通知接口,基本上,变化来源是 Phone,因此,TelephonyRegistry 只是做了一个中转站的作用。