电话拨打的app层流程

最近了解了下在APP层通过发送intent来实现拨打电话的具体流程,通过研究log得出结论如下:

Intent i = new Intent(Intent.ACTION_CALL);
		i.setData(Uri.fromParts("tel", s, null));
		i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		startActivity(i);

以上代码添加在任意app中都可以实现拨打电话号码为s的功能,s的类型为string。接收该intent的activity位于Phone中的OutgoingCallBroadcaster.java中。所以OutgoingCallBroadcaster的onCreate方法会在intent发出后第一时间被调用。进入OutgoingCallBroadcaster之后首先进入processIntent()方法对intent进行处理,在该方法里面会对收到的intent进行初步判断。

1.如果是EMERGENCY CALL并且拨打的号码也是EMERGENCY号码的话,就会将callNow参数设为true。然后调用PhoneGlobals.getInstance().wakeUpScreen();点亮屏幕,然后执行PhoneGlobals.getInstance().callController.placeCall(intent);方法直接将拨号送出,placeCall的具体方法就不做分析了,这又是一大串的东西。

2.如果只是普通的CALL请求,则callNow参数仍为false,此时会用到一个callOrigin的参数,String callOrigin = intent.getStringExtra(PhoneGlobals.EXTRA_CALL_ORIGIN);由于在intent中并未设置这个值,所以会调用PhoneGlobals.getInstance().resetLatestActiveCallOrigin();方法对callOrigin处理,处理的结果就是发出一个新的broadcast,并由OutgoingCallBroadcaster中的receiver来接收,新的intent为NEW_OUTGOING_CALL,具体内容参照源码,这里就不一一列举了。

OutgoingCallReceiver是定义在OutgoingCallBroadcaster内部的,在接收新发出的intent后会执行startSipCallOptionHandler()方法,在执行之前同样会对接收到的intent做相关判定(主要是关于ota升级),在startSipCallOptionHandler()方法中调用PhoneGlobals.getInstance().callController.placeCall(newIntent);实现电话的最终拨出。

关于placecall方法:

该方法位于phone程序的CallController.java文件中,在该方法的最后调用到了displayCallScreen方法,然后跳转到InCallScreen.class中,最后是callcard至此,拨号界面总算蹦出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值