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 中:


<PreferenceScreenandroid: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 的界面布局: <PreferenceScreenandroid:key="button_more_expand_key"android:title="@string/labelMore"android:persistent="false"> ...

<ListPreferenceandroid: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 {

privatePreferenceScreenmSubMenuFDNSettings;

privateListPreferencemButtonCLIR;

privateCheckBoxPreferencemButtonCW;

...

protected voidonCreate(…) {

PreferenceScreenprefSet=getPreferenceScreen();

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

...

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

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


publicbooleanonPreferenceChange(Preference preference, ObjectobjValue){

if (preference ==mButtonCLIR) {

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

...

}

private voidhandleCLIRClickRequest(inti) {

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 voidhandleMessage(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部分了。放在下一篇文章在写吧。

更多相关文章

  1. 2019 Android开发趋势及必备技术点!
  2. 基于底层事件的录制回放实现
  3. Android(安卓)副屏相关修改
  4. Android(安卓)屏幕分辩率相关问题
  5. Android有用代码片段(二)
  6. Android(安卓)系统启动过程详解
  7. 利用HTML5开发Android
  8. Android之UI学习篇八:使用GridView实现九宫格的菜单
  9. Android移动view动画问题 关于view的位置移动了,但view里面绑定的

随机推荐

  1. 谈Android终端厂商的如何建设 ——
  2. Android Socket与HTTPS校验
  3. Android(安卓)点击通知栏消息打开activit
  4. 一起Talk Android吧(第二百六十五回:Androi
  5. MacAndroid源码下载 Android10详解
  6. Android 为什么主线程的looper 一直循环
  7. 甩掉谷歌,Android阵营的集体性尴尬
  8. 2015年11月广师android群内容分享
  9. Android手机分辨率问题
  10. 对手机厂商来说,“Android”并不是一个功