Telecom服务

telecom服务概述

android5.0之后通信系统重构比较大,framework和app层都加入了Telecomm包。

framework是frameworks/base/telecomm/,app是packages/services/Telecomm

telecomm继原先的phone服务之后又加入了telecom服务,客户端使用的文件是:

frameworks/base/telecomm/java/com/android/internal/telecom/ITelecomService.java

    /**
     * @see TelecomServiceImpl#silenceRinger
     */
    void silenceRinger(String callingPackage);
该类中有很多方法,例如该文件中定义了silenceRinger方法,功能是停止来电响铃。熟悉更早版本代码的同学会知道该方法原先是phone服务中实现的,5.0后转到了telecom服务。

服务实现和启动

服务实现在packages/services/Telecomm/src/com/android/server/telecom/TelecomServiceImpl.java

  private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
         ...
        /**
         * @see android.telecom.TelecomManager#silenceRinger
         */
        @Override
        public void silenceRinger(String callingPackage) {
            synchronized (mLock) {
                enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);

                long token = Binder.clearCallingIdentity();
                try {
                    Log.i(this, "Silence Ringer requested by %s", callingPackage);
                    mCallsManager.getRinger().silence();
                } finally {
                    Binder.restoreCallingIdentity(token);
                }
            }
        }
        ...
}
   public ITelecomService.Stub getBinder() {
        return mBinderImpl;
    }
该类有个getBinder函数,被packages/services/Telecomm/src/com/android/server/telecom/components/TelecomService.java使用
public class TelecomService extends Service implements TelecomSystem.Component {

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(this, "onBind");
        initializeTelecomSystem(this);
        synchronized (getTelecomSystem().getLock()) {
            return getTelecomSystem().getTelecomServiceImpl().getBinder();
        }
    }
    ...
}
在AndroidManifest.xml中:

        <service android:name=".components.TelecomService"
                android:singleUser="true"
                android:process="system">
            <intent-filter>
                <action android:name="android.telecom.ITelecomService" />
            </intent-filter>
        </service>
可见该TelecomService就是Android四大组件中的Service,不过特殊之处是运行在system进程中

至于这个Service是谁启动的,而telecom服务怎么通过ServiceManager.addService添加到系统服务中,见 android 5.1 TelecomService启动过程,懒得重复劳动了

服务使用

frameworks/base/telecomm/java/android/telecom/TelecomManager.java

    private ITelecomService getTelecomService() {
        return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE));
    }
   public void silenceRinger() {
        try {
            if (isServiceConnected()) {
                getTelecomService().silenceRinger(mContext.getOpPackageName());
            }
        } catch (RemoteException e) {
            Log.e(TAG, "Error calling ITelecomService#silenceRinger", e);
        }
    }
与TelephonyManager类似,通过binder调用telecom服务。有趣的是TelephonyManager也使用了该方法:

  public void silenceRinger() {
        try {
            getTelecomService().silenceRinger(getOpPackageName());
        } catch (RemoteException e) {
            Log.e(TAG, "Error calling ITelecomService#silenceRinger", e);
        }
    }
这个就纯粹是历史原因了,因为这个方法本来就是在TelephonyManager中的,而且用的是phone服务。之前有很多代码已经写了,这个方法目前实在是不好删除啊。

和phone服务的关系

telecom服务和phone服务的关系其实就是Telecomm.apk和TeleService.apk之间的关系。
telecomm是一个更一般的通讯框架,从它运行在system进程中就可以看出它的地位,gsm,cdma等蜂窝电话的技术细节和规范实现被保留在TeleService中。
除了这两个基本的通信方式外,还有国外比较普及的SIP通话,wifi通话,将来5G要普及的数据信号通话(目前还是模拟信号为主,微信qq等的语音或视频通话算是数字信号但是并不普及,没有运营商主干网的支撑效果也不好。目前国内移动已经开始推进融合通信,例如新的预装融合通信apk的运营商手机发短信就是和微信一样是走数据流量了,不会再是一条一毛钱了,但是通话这块好像还是没有动静,继续走Volte)。
技术细节被保留在TeleService或者其他模块后,telecom维护的就是最一般的通信状态,例如不管什么通信方式都会有连接对方的动作(拨号)、结束和对方通信(挂断电话)、对方请求和你通讯(电话来电,响铃等)。TeleService中的phone对象作为一个或者几个账户(一般情况:国内双卡机器就是两个账户,单卡机器一个)登记注册到Telecom模块中,其他的通话方式也可以作为一个账户登记到telecom中,这样用户拨号时候可以选择其它的通信方式通话,苹果的facetime类似于这个理念。例如设想下,微信就可以注册到telecom中(虽然目前好像并没有实现这个),这样和对方通话可以直接选择微信通话电话,不过这要求双方android5.0版本以上手机、联网,类似苹果的imessage理念(要求双方苹果手机、联网且都登录苹果账号,然后发短信会优先选择数据流量)。
捎带提及的是UI层在5.0后也被分离了出去,代码在packages/apps/InCallUI中(7.0 挪到了Dialer目录下),这样原先5.0之前的一个apk被拆分成了三块:负责通信初始化和通话技术细节维护的Telephony,负责一般通讯状态实现和维护的Telecomm,和通话界面InCallUI;framework由原先4.x(具体小版本号是多少忘记了)之前的frameworks/base/telephony也拆成了三块:telecom框架层代码frameworks/base/telecomm/,三方也用的通讯层(如SignalStrength,状态栏显示信号会用;TelephonyManager,专门给三方用的啊)代码frameworks/base/telephony,通信类apk(如Telephony,Mms,TelephonyProvider)才用的代码frameworks/opt/telephony/
目前除通信模块相关代码外framework中原本调用phone服务的地方基本都会调用telecomm服务了。和通信模块相关但非通话相关的继续用TelephonyManager,例如获取imei;和通话相关的用TelecomManager就对了,如停止响铃和判断当前是否是incall状态。




  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值