没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、 Phone电话过程分析
Phone模块电话流程图如下:
Phone服务:是指 Phone所能提供的各种服务(来电去电,短信,SIM的锁定,数据连
结传输等)与 service不是同一个概念。
Phone 中的 service是 ITelephony和 ITelephonyRegistry的实现类,
PhoneInterfaceManager.java和 TelephonyRegistry.java,后续说明。
GSMPhone 管理了电话服务的内部功能,也对 RIL层进行了封装,上层应用不能直接跟
RIL本地代码打交道,而是间接通过 GSMPhone.但是应用层为了更方便的访问电话服务,需
要在 GSMPhone之上的 TelephonyManager。
TelephonyManager通过两个 IBinder接口 ITelephony和 ITelephonyRegistry来完成
这项工作。
ITelephony是电话服务用户(用户层或框架其他部分)主动进行 RIL访问的路径,它的服
务端实现类不在代码中,而是在 Phone应用
PhoneInterfaceManager.java(packages/apps/Phone/src/com/android/phone/)中。
PhoneInterfaceManager.publish中以”phone”为名注册该服务,提供拨号界面、呼叫、
挂机等呼叫相关控制,也提供 SIM PIN、开关 Radio等操作,他的实现是通过调用 Phone
接口来操作。
ItelephonyRegistry提供一个通知机制,将底层状态变更通知给电话服务的用户(用
户层或框架其他部分),是用户被动通知的路径,通知消息如网络状态、信号强弱更新、电
话状态更新等。它的服务端实现在框架代码中
TelephonyRegistry.java(frameworks/base/services/java/com/android/server/)。
底层通知的来源,是 GSMPhone通过 PhoneNotifier的实现者 DefaultPhoneNotifier将具
体的事件转化为函数调用并且通知到 TelephonyRegistry。TelephonyRegistry再通过两种
方式通知给用户,其一是广播事件,另外一种是通过服务用户在 TelephonyRegistry中注
册的 IphoneStateListener接口,实现回调。
SystemServer.java实现了电话服务的添加
………
ServiceManager.addService("telephony.registry",new TelephonyRegistry(context));
………
对于在 SystemServer.java中添加的 Service,SystemServer.java 中的 init1()函
数保证了 Service在后台不断运行,具体的底层实现,需要查看文档和源码。
1.1去电流程
不论打电话的方式是何种(拨号盘拨打,通话记录中拨号,联系人中拨号。。),都会触发
outgoingCallBroadcast的 onCreate()函数,获得 Action & Number,并对其进行判断,并
且广播给 outgoingCallReceiver内部类,发送 Intent.ACTION_NEW_OUTGOING_CALL消息。
outgoingCallReceiver收到 Intent消息,调用 onReceiver() -> doReceiver(),启动
InCallScreen界面。
进入 InCallScreen后,可以分为 15个函数调用。
具体的分析如下:
1.进入 InCallScreen类中,如果是第一次进入,调用 onCreate()函数(1),如果在通话过
程再一次的拨打电话,调用 onNewIntent()函数(2)。两个函数都会调用
IntentResolveIntent()函数(3),在这个函数中调用 InCallScreen类中的成员方法
placeCall()函数(4)。
InCallScreen中的 placeCall()函数调用类 PhoneUtils.placeCall()函数(5),
PhoneUtils.placeCall()函数调用 phone.dial()函数,至此 app层的函数调用结束,转到
frameworks层。
InCallScreen.java 和 PhoneUtils.Java在
packages\apps\phone\src\com\android\phone…
(6) PhoneUtils.java中
static int placeCall(Phone phone, String number, Uri contactRef)
(7) Connection cn = ◊phone.dial(number);
GSMPhone.java
在 phone应用程序中,通过 PhoneFactory来获取 GSMPhone实例。
GSMPhone()....
(8)dial(String dialString)
(9)mCT.dial(mmi.dialingNumber, mmi.getCLIRMode()); (PS: GsmCallTracker mCT)
GsmCallTracker.java
GsmCallTracker类 dial (String dialString)...
(10)dial (String dialString, int clirMode) {
...
(11)cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());
(ps: CommandInterface cm = phone.mCM)
...
}
因为 RIL.java (frameworks\base\telephony\java\com\android\internal\telephony):
public final class RIL extends BaseCommands implements CommandsInterface所以
cm.dial
实际上调用的是 RIL.java 中的 dial (12)◊-
RIL.java
(12)dial (String address, int clirMode, Message result)
LRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
(13)send()
(14) msg.sendToTarget();
target.sendMessage(this); (frameworks/base/core/java/android/os/Message.java)
//Handler.java (frameworks\base\core\java\android\os)
boolean sendMessage(Message msg){
return sendMessageDelayed(msg, 0);
}
--> return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
---> sent = queue.enqueueMessage(msg, uptimeMillis);
(15) RIL.java
class RILSender extends Handler implements Runnable{
//把消息放入到消息队列
public void handleMessage(Message msg)
..
s.getOutputStream().write(dataLength);
s.getOutputStream().write(data);
剩余12页未读,继续阅读
jmq_0000
- 粉丝: 647
- 资源: 55
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页