天天看點

android phone學習1

唉,又深夜了。白天圖生存,晚上求發展。得努力。就幹這個的。不會真不行。一直很想做通信軟體。難啊。為什麼難。看的少了。什麼時候開始學習都不晚。慢慢入門吧。

這個電話功能相當複雜。真不懂,一點都不懂。唉。看了源代碼。好多啊。基本看不懂。慢慢來。打算用一年的時間慢慢看。早晚得對這個電話有認識。來吧。今天第一天。開始了

我看關鍵是這個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在下次說。累了。這個東西真複雜啊。要有耐心。有信心。 一直看,咬着牙看。慢慢琢磨。功到自然成。

臧春傑

繼續閱讀