您的位置:首页 > 移动开发

电话拨打的app层流程

2013-08-28 11:05 197 查看
最近了解了下在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至此,拨号界面总算蹦出来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: