Android call setting 源码分析 从顶层到底层(上)
来源:互联网 发布:购买淘宝皇冠店铺 编辑:程序博客网 时间:2024/06/06 00:33
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">
…
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 voidsetCLIR(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 源码分析 从顶层到底层(上)
- Android call setting 源码分析 从顶层到底层(上)
- Android call setting 源码分析 从顶层到底层
- 【收藏】Android call setting 源码分析 从顶层到底层
- Android call setting 源码分析 从顶层到底层(下)
- Android call setting 源码分析 从顶层到底层(下)
- Android call setting 源码分析 (上)
- Android call setting 源码分析
- android 从顶层到底层 学习笔记--- framework架构
- android 从顶层到底层 学习笔记--- View树
- Android手动卸载usb从上层到底层源码分析
- 电池电量分析 从上层到底层
- Camera从上层APP到底层分析
- Camera从上层APP到底层分析
- Altium Designer批量把一些元件从顶层换到底层
- 从Android源码层分析acticity的启动顺序
- 从概念到底层技术,区块链一站式分析和汇总
- 从源码上分析Android View保存数据状态
- glibc版本冲突导致的Floating point exception
- Centos学习笔记---文件搜索命令
- How To Generate An XML File As A Target Datastore Using ODI In An Integration Interface ? [ID 454268
- 发现Set<String> set = hashMap.keySet()的奥秘
- thinkphp model 命名注意
- Android call setting 源码分析 从顶层到底层(上)
- win7下安装SQL Server 2005 Express(收集整理)
- Android call setting 源码分析 从顶层到底层(下)
- VOS2009/VOS3000软交换系统的安装步骤
- Linux-2.6.32.2内核在mini2440上的移植(十七)---移植PWM控制蜂鸣器驱动
- pushviewctroller nil
- ACM进阶指南
- 计算器修正版
- 罗马数字 in wiki