android telephone 4.2 framework层分析

framework层的相关代码主要在GSMPhone、CallManager、GSMCallTracker、TelePhonyManager中。

GSMPhone:

与GSMPhone关联的主要是Phone.java、PhoneBase.java、GSMPhone.java。Phone作为基类,定义了25对Handler消息注册和注销的接口,而PhoneBase继承Phone实现了24对,还有一对在GSMPhone中实现,而GSMPhone继承了PhoneBase。

如何管理Phone对象的呢?在应用层的PhoneApp中调用PhoneFactory的静态方法makeDefaultPhones创建Phone对象,而framework中采用的是代理模式和工厂模式实现,在makedefaultPhone中,创建了PhoneProxy,参数为GSMPhone或者CDMAPhone对象,通过PhoneProxy间接的访问GSMPhone,增加了安全性。

GSMPhone继承了PhoneBase,而PhoneBase中继承了Handler。使用了RegistrantList的消息处理机制,注册和注销Handler消息,并且发送notifyXXX方法发出多个注册的通知。在应用层中获取当前Phone的状态,getForegroundCall、getBackgroundCall、getRingingCall,实际获取的是GSMPhone中的mCT即CallTracker的属性。

CallTracker 通话管理

主要功能在GSMCallTracker中实现,GSMCallTracker继承CallTracker,CallTracker继承Handler,因此GSMCallTracker的handleMessage接收CallTracker的消息。GSMCallTracker类主要提供两大处理能力:

1、通话控制能力,如拨号、接听来电、拒接、多方通话(conference)和交换通话(switchWaitingOrHoldingAndActive),最终都会调用operationComplete方法,完成了通话管理和控制操作,该方法中也会查询Call List通话列表,在接收到EVENT_CALL_STATE_CHANGE方法后(即通话状态变化后),调用pollCallsWhenSafe方法,查询当前CallList的通话列表。

2、Handler消息处理逻辑。接收的来自RIL对象cm的消息,包括通话状态的变化、无线通信模块Modem或者Radio开启、无线通信模块关闭或不可用状态,以及接收CallTracker的消息。

流程如下:

CallManager可以被上层调用,它运行于framework层,接着调用GSMPhone的mCT对象调用dial、acceptCall等控制通话,Calltracker中会调用cm的控制方法,cm为RIL层的对象,RIL层处理完毕后,发起EVEMT_OPERATION_COMPLETE消息,在GSMCallTracker中处理,调用operationComplete,调用RIL的cm对象查询Call List列表,RIL层查询完毕后,发起EVENT_POLL_CALLS_RESULT消息,GSMCallTracker处理消息,调用handlePollCalls处理,更新通话状态并且发出相关的消息通知。

GSMCall的通话管理模型:

GSMCall中包含state状态和connections通话连接列表。GSMConnection保存了通话连接的基本信息,多个GSMConnection对象组成一路通话,而GSMCall管理state和connections,一路通话中有多个通话连接,即多方通话。

handlePollCalls方法:

通过接收到的Message消息,获取Call List,对象,强制转化为List对象,这时保存的实际上是DriverCall,RIL层的对象。匹配connections和DriverCall List中对应的DriverCall对象。dc.index== i++;conn表示老的通话连接,而dc表示新的通话连接。

android telephone 4.2 framework层分析,布布扣,bubuko.com

时间: 2024-08-25 12:50:37

android telephone 4.2 framework层分析的相关文章

Android如何完全调试framework层代码

1 之前写过一篇文章:<Android实现开机调试system_process> 2 google的eclipse插件ADT的已经能够很方便的调试Android的apk了,但是调试的时候应用程序已经进入Activity. 3 如果我们想了解一下Activity的启动过程,只有看代码+看log输出了吗?本文可以告诉你:NO! 4 相信大家比较感兴趣的都是代码,这里先把代码再放出来 ZygoteInit.java [java] view plaincopy public static List&l

Android4.0(Phone)拨号启动过程分析(三)与Framework层通信

由于Android几乎所有的代码都是公开的,如果要对Framework层分析就必需先拿到Framework层的代码,我在前面已经搭建好了ubuntu14.04的环境,下载好了Android4.0的源码,其中也包括了Framework层和Package的代码,导出到宿主机Windows XP中用Source Insight 3.5工具来查看源码,Package中的代码可以导入到Eclipse下查看,我是把frameworks\base整个目录都导入到Source Insight 3.5工程中,可以

Android Framework层Power键关机流程(一,Power长按键操作处理)

一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManager开始分析,在分析前我这里打印了该方法的堆栈调用信息.大家可以参考一下. public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) { ...... android.uti

Android源码剖析之Framework层基础版

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMangerService和ActivityManagerService(注意非控件,而是指一类服务)以及其他一些东西,对底层做一个更为全面的认识.而很早以前,写过一篇文章,来简述Android系统-" Android高级之系统介绍 ",同样今天我们在讲Framework层时也会再对系统做一个回顾

如何从C++代码直接访问android framework层的WifiService

说到底,Java层的service就是就C++层的binder的封装,所以从原理上来讲通过C++代码直接访问android framework层的service是完全可能的,这篇文章以访问WifiService为例,讲解如何去实现这个功能. 费话少说,直接上代码: WifiTest.cpp #include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadSt

android framework层 学习笔记(一)

大体结构 最近在研究android framework层的开发.  先来一张frame work的源码结构图 1  api 文件夹  不清楚用途,该目录下只有一个current.txt 内容看上去像代码,先放一放 2  cmds 文件夹,顾名思义是android 所支持的 command (命令) 最明显就是里面第一个文件夹就是am ,对应着android中的am 命令. 其他的命令里面有C语言写的也有java+C的. 3    core  文件夹这个文件夹下面有四个文件 java jni re

怎样从C++代码直接訪问android framework层的WifiService

说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiService为例,解说怎样去实现这个功能. 费话少说.直接上代码: WifiTest.cpp #include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadSt

Android怎样在Framework层使用解锁代码

import android.app.KeyguardManager; import android.app.KeyguardManager.KeyguardLock; import com.android.server.wm.WindowManagerService; KeyguardManager keyguardManager = (KeyguardManager)mContext.getSystemService("keyguard"); KeyguardLock keygua

Android framework层JNI的使用浅析

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/42418977 JNI技术对于多java开发的朋友相信并不陌生,即(java native interface),本地调用接口,主要功能有以下两点: 1.java层调用C/C++层代码 2.C/C++层调用java层代码 可能有些人会觉得jni技术破坏了Java语言的跨平台性,有这种想法可能是因为你对java理解得还不够深,如果你看看jdk源码,你会发现在jdk里面大量使用了jni技术,而且