Android 的 call setting 是用来设定与 simcard 相关的一些内容的应用程序,如网络,PIN等等,算是AP层。这里就选择其中一个项从源代码读下去直到底层,看看大概的结构和流程。

在 Android 主菜单中选择 setting->call setting->additional call setting->caller ID,会弹出来一个对话框来选择,这个项是用来设定在用电话本拨打电话的时候是否显示对方的电话号码。这里就以这个设定为例来一步步读下去。

AP层:

call setting 的代码和资源都是放在/packages/apps/Phone 的目录下。其实 Android 的 setting AP 相关的资源都是放在/packages/apps/setting 下的。但是看 /packages/apps/Settings/res/xml/settings.xml 中:


<PreferenceScreen android:key="call_settings" android:title="@string/call_settings_title"android:summary="@string/call_settings_summary">

<
intent 
android:action
="
android.intent.action.MAIN
"
 android:targetPackage
="
com.android.phone
"
android:targetClass
="
com.android.phone.CallFeaturesSetting
"
 />
</
PreferenceScreen
>

从这里就可以知道,android 的call setting 的包指向了 phone,并且知道了入口是 CallFeaturesSetting 类。
在/packages/apps/Phone/res/call_featrue_setting.xml 中有call setting 的界面布局:
 
<PreferenceScreen android:key="button_more_expand_key" android:title="@string/labelMore"android:persistent="false">
...

<ListPreference android:key="button_clir_key" ... />
 
这个button_clir_key就是对应的 caller ID 的那个按钮,从这里可以看出是一个ListPreference,点击会出现一个列表框。里面出现的内容布局都在这里定义。相关的xml档都在/packages/apps/Phone/res 下。
接着就是AP的代码了,在/packages/apps/Phone/src 下。前面说了入口是 CallFeaturesSetting:
 
public class CallFeaturesSetting extends PreferenceActivity {

private PreferenceScreen mSubMenuFDNSettings;

private ListPreference mButtonCLIR;

private CheckBoxPreference mButtonCW;

...

protected void onCreate(…) {

PreferenceScreen prefSet = getPreferenceScreen();

mButtonCLIR  =   (ListPreference) prefSet.findPreference(BUTTON_CLIR_KEY);

...

定义的 mButtonCLIR 就是对应caller ID 的变量。在onCreate中初始化,用findPreference来找到XML中对应的资源。

然后是对这个按钮的响应代码:

public boolean onPreferenceChange(Preference preference, Object objValue){

if (preference == mButtonCLIR) {

handleCLIRClickRequest(mButtonCLIR.findIndexOfValue((String) objValue));

...

}

private void handleCLIRClickRequest(int i) {

mPhone.setOutgoingCallerIdDisplay(i,Message.obtain(mSetOptionComplete, EVENT_CLIR_EXECUTED));

}

可以看到最终是调用 mPhone.setOutgoingCallerIdDisplay 来完成真正的设定。这个 mPhone 是

com.android.internal.telephony.Phone,mPhone 的调用就进入 framework 层了。

Framework层:

相关的代码在/frameworks/base/telephony/java 中。先从 Phone 开始,这是一个 interface,真正实现是在

com.android.internal.telephony.gsm.GSMPhone 中:

public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) { mCM.setCLIR(commandInterfaceCLIRMode, h.obtainMessage(EVENT_SET_CLIR_COMPLETE, commandInterfaceCLIRMode, 0, onComplete)); }

这里是调用 mCM.setCLIR。mCM 是一个 CommandsInterface,真正实现是在 RIL.java 文件中。这下到了framework中

真正办实事的地方。同样是在com.android.internal.telephony.gsm 下,RIL类中:

public void setCLIR(int clirMode, Message result)

{ RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_CLIR, result); rr.mp.writeInt(1); rr.mp.writeInt(clirMode);

... send(rr); }

这里顺便说一下,RIL与底层是用socket来通信。所以send(rr)最终是把RIL_REQUEST_SET_CLIR发给底层,底层会有一个守护

进程来接收framework层的信息,并且把结果传达上去。继续看下send的代码:

private void send(RILRequest rr) { Message msg; msg = mSender.obtainMessage(EVENT_SEND, rr); acquireWakeLock(); msg.sendToTarget(); }

是发一个EVENT_SEND的message给系统。那么找这个 handle 这个 message 的地方,还是同一个文件里,RIL.RILSender类

里面的handleMessage:

public void  handleMessage(Message msg)

{

RILRequest rr = (RILRequest)(msg.obj);

switch (msg.what) { case EVENT_SEND:

LocalSocket s; s = mSocket;

... byte[] data; data = rr.mp.marshall(); rr.mp.recycle(); rr.mp = null; // parcel length in big endian dataLength[0] = dataLength[1] = 0; dataLength[2] = (byte)((data.length >> 8) & 0xff); dataLength[3] = (byte)((data.length) & 0xff); s.getOutputStream().write(dataLength); s.getOutputStream().write(data);

...

这里的mSocket 在就是与底层沟通的socket,有兴趣可以看看相关代码。

到这里 framework 层也算告一段落,在下去就是底层的C部分了。放在下一篇文章在写吧。

Android call setting 源码分析 (上)的更多相关文章

  1. Android call setting 源码分析

    看下篇之前,请先读这三篇文章: Android GSM驱动模块(rild)详细分析(一)基本架构及初始化 Android GSM驱动模块(rild)详细分析(二)request流程 Android G ...

  2. Android网络框架源码分析一---Volley

    转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium ...

  3. OpenGL—Android 开机动画源码分析一

    .1 Android开机动画实现方式目前实现Android开机动画的方式主要是逐帧动画和OpenGL动画. ?逐帧动画 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的 ...

  4. Android分包MultiDex源码分析

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52845661 本文出自: [HansChen的博客] 概述 Android开发者应该 ...

  5. SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...

  6. Android Doze模式源码分析

    科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...

  7. Android消息机制源码分析

    本篇主要介绍Android中的消息机制,即Looper.Handler是如何协同工作的: Looper:主要用来管理当前线程的消息队列,每个线程只能有一个Looper Handler:用来将消息(Me ...

  8. Android开源框架源码分析:Okhttp

    一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor ...

  9. Android -- 消息处理机制源码分析(Looper,Handler,Message)

    android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...

随机推荐

  1. 于CentOS 6 安装 Wordpress

    1.两种方式给Wordpress 首先,你可以去wordpress最新的官方网站看看wordpress多少下载.例wordpress 3.9.1下载地址: http://cn.wordpress.or ...

  2. .net4.5的弱事件

    .net4.5的弱事件 没有伟大的愿望,就没有伟大的天才--Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 事件-我的讲法 老师常告诉我,事件是特殊的委托,为委托提供 ...

  3. JS获取渲染后的样式

    一般我们利用element.style.属性来获取CSS的样式,而此方法只能获取标签内的样式,无法获取头部或引入的样式,因此,而我们又需要获取其样式,则我们可以使用:(其中element为标签,pro ...

  4. PHP 4:从Login进一步看到的

    原文:PHP 4:从Login进一步看到的 我们已经在PHP 3:从Login界面谈PHP标记谈到了PHP标记,不过其页面代码有一句 require_once('bookmark_fns.php'); ...

  5. DirectX (13) 粒子系统

    笔者:i_dovelemon 资源:CSDN 日期:2014 / 10 / 16 主题:Point Sprite, Particle System 介绍 在游戏中.非常多的绚丽,灿烂的特效,都能够使用 ...

  6. 《Visual Studio Magazine》2013年读者选择奖—软件类

    <Visual Studio Magazine>会在每年的下半年向读者发出投票邀请,读者将在28个大类,超过500个开发工具的名单中选出他们认为最好的产品,以票数评出各分类的金.银.铜奖. ...

  7. C#编程实践—EventBroker简单实现

    前言 话说EventBroker这玩意已经不是什么新鲜货了,记得第一次接触这玩意是在进第二家公司的时候,公司产品基础架构层中集成了分布式消息中间件,在.net基础服务层中使用EventBroker的模 ...

  8. SQL Server 创建表分区

    原文:SQL Server 创建表分区 先准备测试表 CREATE TABLE [dbo].[Employee] ( EmployeeNo ,) PRIMARY KEY, EmployeeName ) ...

  9. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10(转载)

    在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html> ...

  10. 【转】【Android UI设计与开发】第07期:底部菜单栏(二)Fragment的详细介绍和使用方法

    原始地址:http://blog.csdn.net/yangyu20121224/article/category/1431917/1 由于TabActivity在Android4.0以后已经被完全弃 ...