拨打电话的流程

拨打电话的流程
1.拨打界面
1)应用中的.java
在这个类中主要做的操作就是输入拨打的电话号码和拨号按钮 , 在()的方法中会初始化拨号界面 , 当用户点击数字键和拨打键都会调用()函数 , 在点击了拨号键后会调用(int simId)函数 , 该函数的作用就是用来发送 , 来实现跳转 。具体代码如下:
= new (.ED);
.(Uri.("tel", , null));
.(Phone., simId);
.(.SK);
();
通过代码发现 , 其跳转的是.ED , 遍历phone应用中的.xml可以发现在ter类中有该的定义 。因此当点击了拨号键以后 , 系统会跳转到ter.java中 。
2. ter.java
1)在这个类中的()的方法显示把做下修改 , 又原来的.ED改成.Y或者. 。接着就是要确保手机的屏是亮起的 , 所以调用.().()函数 。接下来就是跳转到界面 , 代码如下:
.(this, .class);
();
在此同时 , 会发送一个.CALL的广播 , 一是为了方便其他用户用来监听电话状态 , 二是用来结束自己的并开始拨打 。在这里用到了一个有序广播 。不知道你有没有用过 , 反正我没用过(提供一个链接可以看:) 。
4.通话界面
1).java这个类个人认为是整个电话中的核心类 , 代码量也相当的庞大 , 需要深入仔细的看看 。
1.1当你开机后第一次拨打电话的时候会调用()方法 。记住只有开机第一次拨打电话的时候才会调用哦!!会创建出一个通话界面 , () 。在G6中由于CPU主频比较差 , 第一次加载界面的时候会很慢 , 所以我们可以把资源文件的加载放到中去实现 , 但是要确保把资源文件放出去后不会引起调用资源的空指针 , 这样就得不偿失了 。
1.2 接下来就是()方法了 , 该方法每次拨打电话的时候都会被调用 。在这里主要做的是逻辑处理,比如创建一个实例对象;判断来电还是去电如果是来电就要显示(后面会具体阐述);设置来电界面的模式( );
1.3 接通电话后 , .java继承 是在的()方法中被初始化 。该类主要是负责显示通话对方的信息和通话时间 。psed()该方法是用来记录通话时间的 。s()根据电话的状态来决定是否显示通话时间 , 以及开始和结束计时 。
1.4 在通话中会调用到很多(关注.java) , 首先看下锁的定义:
pm = () (.);
= pm.(.
| .P
| .
, );
= pm.(.
| ., );
= pm.(., );(距离传感器的锁)
当电话处于状态的时候 会调用.();来获得锁 , 让屏幕不会熄灭 , 
当接通以后横屏放置的时候 , 会调用 .()和 .() , 当达到屏幕超时时间的时候可以灭屏 , 但CPU还是在运行 。
当接通后竖屏放置的时候  , 和 都会被释放 , 同时获得 。该锁的作用就是当有物体靠近的时候屏会灭 , 物体离开的时候会亮 。
在这里说下的逻辑事件 , 关注rMode(Phone.State state)这个方法 。在这个方法里 你可以修改对的调用 。在G6中 , 客户要求横屏的时候距离传感器也起作用 , 通过代码发现在该方法中有
== r.AL这么一个属性 , 该属性的作用就是判断手机是横放还是竖放 , 这就直接影响到了后面的逻辑判断 , 根据客户的需求我们只要把这个属性去掉 , 就可以满足客户的要求 。
1.5 通话过程结束后 , 首先是会监听到挂断信息 , 调用()方法 , 并唤醒屏幕 。