唉,又深夜了。白天圖生存,晚上求發展。得努力。就幹這個的。不會真不行。一直很想做通信軟體。難啊。為什麼難。看的少了。什麼時候開始學習都不晚。慢慢入門吧。
這個電話功能相當複雜。真不懂,一點都不懂。唉。看了源代碼。好多啊。基本看不懂。慢慢來。打算用一年的時間慢慢看。早晚得對這個電話有認識。來吧。今天第一天。開始了
我看關鍵是這個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在下次說。累了。這個東西真複雜啊。要有耐心。有信心。 一直看,咬着牙看。慢慢琢磨。功到自然成。
臧春傑