android 电话入门

唉,又深夜了。白天图生存,晚上求发展。得努力。就干这个的。不会真不行。一直很想做通信软件。难啊。为什么难。看的少了。什么时候开始学习都不晚。慢慢入门吧。

 这个电话功能相当复杂。真不懂,一点都不懂。唉。看了源代码。好多啊。基本看不懂。慢慢来。打算用一年的时间慢慢看。早晚得对这个电话有认识。来吧。今天第一天。开始了

 我看关键是这个Phone这个类。这个是个接口。真正实现是 GsmPhone  cdmaPhone , 这是在PhoneFactory这实现的。首先该进程启动的时候,会创建PhoneApp类。该类在OnCreate的时候

if (phone == null) {
            // Initialize the telephony framework
            PhoneFactory.makeDefaultPhones(this);

创建了Phone. 创建了哪个Phone ?

sCommandsInterface = new RIL(context, networkMode, cdmaSubscription);

                int phoneType = getPhoneType(networkMode);
                if (phoneType == Phone.PHONE_TYPE_GSM) {
                    Log.i(LOG_TAG, "Creating GSMPhone");
                    sProxyPhone = new PhoneProxy(new GSMPhone(context,
                            sCommandsInterface, sPhoneNotifier));
                } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
                    switch (BaseCommands.getLteOnCdmaModeStatic()) {
                        case Phone.LTE_ON_CDMA_TRUE:
                            Log.i(LOG_TAG, "Creating CDMALTEPhone");
                            sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,
                                sCommandsInterface, sPhoneNotifier));

根据网络模式创建了相应的gsm cdma  的phone. 这个网络模式是从数据库里读的。

那问题来了。数据里是提前写入了网络模式? 还是后来有人写的。 谁知道该写入什么值呢? 手机制式?

比如创建了GSMPhone. 看到那个构造函数力的CommandINterface了。就是靠这个接口也就是RIL类和Modem通信,实现数据及at 命令传输的。

 

我的理解是对Modem的操作就是 下命令和获取数据获取主动上报数据。这可复杂了去了。

GsmPhone有几个变量特别重要。GsmCallTracker这个类好像就是管理Call类的。

GsmCall ringingCall = new GsmCall(this);
            // A call that is ringing or (call) waiting
    GsmCall foregroundCall = new GsmCall(this);
    GsmCall backgroundCall = new GsmCall(this);

每个GSMCALL又管理着GSMConnection 到这基本就不懂了。纯粹就是看代码了, 同事我也看到GSMCallTracke也有dial方法。

 Connection
    dial (String dialString, int clirMode, UUSInfo uusInfo) throws CallStateException

cm.dial(pendingMO.address, clirMode, uusInfo, obtainCompleteMessage());

难道这个类复杂打电话? 那电话首先得协商好。建立好通路,系统是如何做的呢? 诡异啊

暂时就人为这个GSMCallTracker就是呼叫跟踪管理器吧。 用来下命令的。

 

那上报是哪个来完成的呢?

 GsmServiceStateTracker mSST;好像这个类来实现Modem反馈的信息。因为我看到

 case EVENT_GET_SIGNAL_STRENGTH:
                // This callback is called when signal strength is polled
                // all by itself

                if (!(cm.getRadioState().isOn())) {
                    // Polling will continue when radio turns back on and not CDMA
                    return;
                }
                ar = (AsyncResult) msg.obj;
                onSignalStrengthResult(ar, phone, true);
                queueNextSignalStrengthPoll();

信号增强了?  onSignalStrengthResult(ar, phone, true);  这个的实现

phone.notifySignalStrength();是这个,这个又会

 notifySignalStrength() {
        mNotifier.notifySignalStrength(this);
    }

关于这个DefaultPhoneNotifier在下次说。累了。这个东西真复杂啊。要有耐心。有信心。 一直看,咬着牙看。慢慢琢磨。功到自然成。

posted on 2012-10-12 17:36  nanjing  阅读(209)  评论(0编辑  收藏  举报

导航