RIL层代码分析--拨号整个流程

本文详细解析了Android系统中拨打电话的过程,从DialtactsActivity开始,经过ACTION_CALL_PRIVILEGED Intent,到OutgoingCallReceiver,再到RIL层的事件循环和消息处理,最终触发拨号操作。内容涵盖了Java层与C/C++层的交互,深入理解Android系统的RIL(Radio Interface Layer)通信机制。
摘要由CSDN通过智能技术生成

拨出电话流程:





在系统源码这个路径下/packages/apps/Phone/src/com/android/phone/DialtactsActivity.java

contactsandroidmanifest.xmlandroid:process="android.process.acore"说明此应用程序运行在acore进程中。DialtactsActivityintent-filteraction属性设置为maincatelog属性设置为launcher,所以此activity能出现首先启动的就是这个activity在主菜单中,并且是点击此应用程序的第一个界面。dialtactsactivity包含四个tab,分别由TwelveKeyDialerRecentCallsListActivity,两个activity-aliasDialtactsContactsEntryActivityDialtactsFavoritesEntryActivity分别表示联系人和收藏tab,但是正真的联系人列表和收藏是由ContactsListActivity负责。

2

进入TwelveKeyDialer OnClick方法,按住的按钮id为:R.id.digits,执行

placecall()

Intent intent = newIntent(Intent.ACTION_CALL_PRIVILEGED,

           Uri.fromParts("tel", number, null));

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

3

intert.ACTION_CALL_PRIVILEGED实际字符串为android.intent.action.CALL_PRIVILEGED,通过查找知道了packegs/phone下面的androidmanifest.xmlPrivilegedOutgoingCallBroadcasteractivity-alias设置了intent-filter,所以需要找到其targetactivityOutgoingCallBroadcaster。所以进入OutgoingCallBroadcaster


onCreate()

//如果为紧急号码马上启动intent.setClass(this,InCallScreen.class); startActivity(intent);


Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);


       if (number != null) broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER,number);


       broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);


       broadcastIntent.putExtra(EXTRA_ORIGINAL_URI,intent.getData().toString());


       if (LOGV) Log.v(TAG, "Broadcasting intent " + broadcastIntent+ ".");


       sendOrderedBroadcast(broadcastIntent, PERMISSION, null, null,


                            Activity.RESULT_OK, number, null);


4Intent.ACTION_NEW_OUTGOING_CALL实际字符串为android.intent.action.NEW_OUTGOING_CALL,通过查找知道了packegs/phone


下面的androidmanifest.xmlOutgoingCallReceiver Receiver接收此intent消息。找到OutgoingCallReceiver,执行


onReceive()函数


Intent newIntent = new Intent(Intent.ACTION_CALL, uri);


       newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);


       newIntent.setClass(context, InCallScreen.class);


       newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


5、请求拨号的java部分流程


onCreate(第一次)/onNewIntent(非第一次)


internalResolveIntent


   placeCall(intent);


     PhoneUtils.placeCall(mPhone, number, intent.getData());


       phone.dial(number);


         mCT.dial(newDialString);


           dial(dialString, CommandsInterface.CLIR_DEFAULT);


              cm.dial(pendingMO.address,clirMode,obtainCompleteMessage());//obtainCompleteMessage(EVENT_OPERATION_COMPLETE);


                send(rr);


                  msg =mSender.obtainMessage(EVENT_SEND, rr);

acquireWakeLock();


                  msg.sendToTarget();


                RILSender.handleMessage()


                  case EVENT_SEND:


                    ...


                   s.getOutputStream().write(dataLength);                  


                    s.getOutputStream().write(data);//从这里流程跑到下面ril.cpp中监听部份


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

上面步骤:为APP就是java层传下的信息(就是执行的动作:按键打电话),已经做完,下面讲RIL层如何来接受上层来的信息

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第一、《创建轮询机制》


6.请求拨号的c/c++

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值