本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处
本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉。

概述

       之前有分析过Android 4.2的InCallScreen结构(传送门),但后面Google发布了Android 4.4即Kitkat,遂决定以之前的文章为模板,重新整理并记录。在4.4中当有来电或去电时,显示给用户的界面如图1,在4.4之前称之为InCallScreen,但在4.4之后叫做InCallActivity。在4.4中我们调出的拨号盘界面,实际为DialtactsActivity并隶属于Dialer应用。4.4 中界面分为3块,CallCardFragment、CallButtonFragment、AnswerFragment,如下所示:
 
图 1 InCallActivity界面(左:接通 右:来电)

InCallActivity布局分析

在InCallActivity.java中,实现了对界面的初始化,在4.4中界面的布局是通过fragment来完成的,即incall_screen.xml,代码如下:

[html] view plaincopy
  1. <FrameLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:id="@+id/main">
  6. <!-- MTK VideoCall fragment -->
  7. <FrameLayout
  8. android:id="@+id/vtCallFragment"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent" />
  11. <LinearLayout
  12. android:id="@+id/in_call_and_button_container"
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"
  15. android:orientation="vertical">
  16. <RelativeLayout
  17. android:id="@+id/in_call_card_container"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent"
  20. android:layout_weight="1">
  21. <!-- CallCard fragment 用于显示联系人信息 -->
  22. <fragment
  23. android:name="com.android.incallui.CallCardFragment"
  24. android:id="@+id/callCardFragment"
  25. android:layout_width="match_parent"
  26. android:layout_height="match_parent"
  27. android:layout_alignParentTop="true"
  28. android:layout_alignParentStart="true" />
  29. <!-- 拨号盘 独立出来易于复用 -->
  30. <fragment
  31. android:name="com.android.incallui.DialpadFragment"
  32. android:id="@+id/dialpadFragment"
  33. android:layout_width="match_parent"
  34. android:layout_height="match_parent"
  35. android:layout_alignParentTop="true"
  36. android:layout_alignParentStart="true" />
  37. </RelativeLayout>
  38. <!-- 控制按钮 也就是原来的InCallTouchUi -->
  39. <fragment android:name="com.android.incallui.CallButtonFragment"
  40. android:id="@+id/callButtonFragment"
  41. android:layout_width="match_parent"
  42. android:layout_height="wrap_content"/>
  43. </LinearLayout>
  44. <!-- 来电接听/挂断控件 原始使用的系统的GlowpadView -->
  45. <fragment android:name="com.android.incallui.AnswerFragment"
  46. android:id="@+id/answerFragment"
  47. android:layout_width="match_parent"
  48. android:layout_height="wrap_content"
  49. android:layout_alignParentBottom="true"
  50. android:layout_centerHorizontal="true"
  51. android:gravity="top"
  52. android:layout_gravity="bottom|center_horizontal"
  53. android:layout_marginBottom="@dimen/glowpadview_margin_bottom"
  54. android:visibility="gone" />
  55. <!-- 会议电话管理界面 -->
  56. <fragment android:name="com.android.incallui.ConferenceManagerFragment"
  57. android:id="@+id/conferenceManagerFragment"
  58. android:layout_width="match_parent"
  59. android:layout_height="match_parent"
  60. android:layout_alignParentTop="true"
  61. android:layout_alignParentStart="true"
  62. android:layout_alignParentBottom="true"
  63. android:layout_alignParentEnd="true" />
  64. </FrameLayout>

从整个布局来看,4.4使用fragment代替了原来写死的布局。一方面更能体现出模块化设计,另一方面对于不同屏幕尺寸的适配也更为容易。根据布局文件,InCallActivity主要包括以下几个部分:

  • callCardFragment:用于显示联系人信息及通话时间等;
  • callButtonFragment:通话界面下方的控制按钮,之前叫做InCallTouchUi;
  • conferenceManagerFragment:会议电话的界面;
  • vtCallFragment:视屏通话控件;
  • dialpadFragment:拨号盘显示控件。
  • answerFragment:来电控制控件,用于操作接听/拒接/短信快捷回复。
       总的来讲4.4的布局改动不大,取而代之的是使用更加模块化的布局方式。下面主要展示常见的基础布局,包括callCardFragement、callButtonFragment、answerFragment。

callCardFragment通话信息展示

callCardFragment控件,实际上显示的信息主要为通话联系人的相关信息,整个布局显示如下图2:
图 2  callCardFragment界面

callButtonFragment通话控制界面

在4.4中不再称为InCallTouchUi,而是把下方的控制按钮使用fragment包装了起来,相应的布局可以在call_button_fragment.xml中查看。如图3:
图 3 callButtonFragment

answerFragment来电控制界面

这里所说的来电控制界面实际为4.4之前的MultiWaveView,。如图4:
图 4 answerFragment

InCallActivity初始化流程

在InCallActivity的onCreate方法中,完成了各个组件(fragment)的初始化,主要在方法initializeInCall中,代码如下:

[java] view plaincopy
  1. private void initializeInCall() {
  2. if (mCallButtonFragment == null) {
  3. mCallButtonFragment = (CallButtonFragment) getFragmentManager()
  4. .findFragmentById(R.id.callButtonFragment);
  5. mCallButtonFragment.getView().setVisibility(View.INVISIBLE);
  6. }
  7. if (mCallCardFragment == null) {
  8. mCallCardFragment = (CallCardFragment) getFragmentManager()
  9. .findFragmentById(R.id.callCardFragment);
  10. }
  11. //... ...省略
  12. }

然后更新了状态栏以及近距离感应器的状态,另外MTK对AOSP多了一些定制加入了一些自己的东西,比如SIMInfoWrapperr就是用于显示保存SIM卡信息用的。相对于4.4之前的代码来说,InCallActivity实际上取代了InCallScreen的功能,初始化流程详细请查看代码。这里得提一下InCallUI中的presenter,它相当于是状态机,保存各种状态,而fragment用于承载显示。

InCallActivity初始化时序图如下:

图 5 InCallActivity初始化时序图

CallButtonFragment控制流程

因为4.4代码的变更,我们主要查看以下几个控件的控制和更新流程:
  1. answerFragment:接通/挂断/短信回复时需要使用;
  2. dialpadButton:也就是显示或隐藏拨号盘(DTMF);
  3. audioButton:开启/关闭扬声器;
  4. muteButton:开启/关闭麦克风静音,开启之后对方无法听到你的声音;
  5. holdButton:开启/关闭呼叫保持;
  6. addButton:增加多路通话;也就是在通话的过程中可以暂停当前通话,拨打另一路通话并接通;

answerFragment滑动控件

answerFragment就是原来的MultiWaveView,现在作为一个独立的fragment存在。控制流程时序图如下:

图 6 anserFragment显示/控制时序图

dialpadButton显示/隐藏拨号盘

dialpadButton点击效果与4.4之前差不多,只是与callCardFragment互斥。

时序图如下:

图 7 接通后显示拨号盘时序图

audioButton开启/关闭扬声器

audioButton用于开启/关闭扬声器,同时在接入线控耳机或者蓝牙耳机后,点击会弹出选项,执行时序图如下:
图 8 开启/关闭扬声器
跟4.4以前的流程相比,现在的控制流程是从InCallUI中的callButtonFragment传递到TeleService中的CallCommandService,并再往下传递。

muteButton开启/关闭麦克风静音

麦克静音的开启/关闭与audioButton类似,执行时序如下:
图 9 麦克风静音开启/关闭

holdButton开启/关闭呼叫保持

holdButton用于呼叫保持开启/关闭,执行时序图如下:
图 10 呼叫保持开启/关闭

addButton添加一路通话

addButton在MTK 4.4的代码中有所改动,显示addButton的条件是:具有物理menu按键或属于"tablet"。
图 11 新增一路通话时序图

endButton挂断当前通话

endButton点击后执行时序图如下:
图 12 挂断当前通话时序图

CallCardFragment通话信息显示

CallCardFragment的更新相对于4.4以前来说,更为独立,代码更为清晰(只不过被MTK这么一改,哎……),整个界面更新时序图如下:

图13 CallCardFragment更新时序图

小结

Android 4.4 Phone在UI上并没有大的改动,但是代码的实现方法却发生了很大的变化,通过分析可以基本理清UI界面的更新流程。

最后附上文中涉及时序图的原图下载链接,原图无失真便于查看,下载地址点这里。

Android 4.4Phone的变化(二)相关推荐

  1. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言       原文:[朝花夕拾]Android性能篇之(二)Java内存分配        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...

  2. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. Android开发笔记(一百二十二)循环器视图RecyclerView

    RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...

  4. Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

    Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一.引入依赖 二.工具类 三.构建网络框架 1. Base 2. 异常处理 3. 拦截器 4. 网络请求服务 四. ...

  5. Android AR开发实践之二: Google ARCore介绍

    Android AR开发实践之二: Google ARCore介绍 一.ARCore介绍 二.ARCore工作原理 三.ARCore基本概念 四.ARCore渲染技术 使用OpenGL渲染 使用Sce ...

  6. Android 10.0 PackageManagerService(二)权限扫描-[Android取经之路]

    摘要:PackageManagerService在systemReady()后,进行了/system/etc/permissions中的各种xml进行扫描,进行相应的权限存储,供以后使用 阅读本文大约 ...

  7. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

  8. Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View...

    Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...

  9. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

最新文章

  1. 广播风暴系列专题(一)广播风暴:发现-端口
  2. 128G小米CC9e手机,免费送!真事!
  3. Linux系统查看各种信息
  4. ERROR 1064 (42000): ; check the manual that corresponds to y
  5. 将自己的dcm数据制作成LUNA16数据集提供数据样式之代码整理
  6. 【译文 Part 1】NEO vs. ETH--为什么NEO可能是2018最强数字货币?
  7. 无法添加外键约束的原因(cannot add foreign key constraint)
  8. 梯度离散_使用策略梯度同时进行连续/离散超参数调整
  9. linux 信号阻塞和信号未决
  10. C语言猜拳游戏完整代码
  11. 用计算机处理文字,计算机文字 计算机文字与信息处理
  12. windows部署django项目
  13. ipad上html语言编辑,Html编辑器iPad版
  14. 51单片机之TMOD寄存器
  15. 常用浏览器User-Agent列表
  16. linux cp omitting 复制,Linux中复制目录报错cp:omitting directory的解决办法
  17. 打开模拟器上app的文件位置方法
  18. 获取网页链接里的视频原件
  19. Facebook和Heroku结成伙伴关系
  20. Capture One 21 Pro v14.3.0.185 飞思顶级图像后期处理编辑软件

热门文章

  1. grep命令 |grep
  2. 一个悄然成为世界最流行的操作系统!
  3. php ajax传递数组,ajax怎样传递数组到后台
  4. 动态规划矩阵连乘求最优值和最优解
  5. Linux下多个进程可以同时打开同一个文件吗?文件描述符与打开文件的关系?
  6. 二阶偏微分方程组 龙格库塔法_1、经典四阶龙格库塔法解一阶微分方程组
  7. 光电耦合器原理及应用介绍
  8. Java Z 字形变换
  9. 学习笔记:获取疫情数据,并绘制可视化地图
  10. 关于ROS功能包里package.xml和CMakeList.txt的源码分析