撥號調用流程

1. 撥號界面
1) Contacts包裏面的TwelvekeyDialer.java,爲Activity對象。
2) 首先使用onCreate()創建一個Activity,該Activity顯示了一個撥號的界面。
3) 按數字鍵使得onClick()方法被觸發,由Riddial撥號鍵使得onClick()方法調用placeCall()方法。
4) placeCall()方法中通過Intent跳轉到另一個Activity。由代碼“Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,Uri.fromParts("tel", number, null));”可知其參數爲Intent.ACTION_CALL_PRIVILEGED。查找文件Intent.java中參數聲明,可知ACTION_CALL_PRIVILEGED=android.intent.action.CALL_PRIVILEGED,再通過查找Phone下面的androidmanifest.xml,知道OutgoingCallBroadcaster設置的一項intent-filter的action name爲android.intent.action.CALL_PRIVILEGED,故可知下一個跳轉的界面爲OutgoingCallBroadcaster。
5) 該Acitivity進入onPause()。
2. 界面跳轉
1) OutgoingCallBroadcaster.java,爲Activity對象。
2) 使用onCreate()創建一個Activity,該Activity應該爲介於撥號界面跟通話界面之間跳轉的一個界面。
3) 在onCreate()方法中調用了PhoneApp.getInstance().wakeUpScreen()方法(PhoneApp應該爲對通話的在後臺做進程管理)。
4) 另外在onCreate()方法中使用Intent跳轉到一個BroadcastReceiver。由代碼“Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);”可知其參數爲Intent.ACTION_NEW_OUTGOING_CALL。查找文件Intent.java中參數聲明,可知ACTION_NEW_OUTGOING_CALL=android.intent.action.NEW_OUTGOING_CALL,再通過查找Phone下面的androidmanifest.xml,知道OutgoingCallReceiver設置的一項intent-filter的action name爲android.intent.action.NEW_OUTGOING_CALL,故可知OutgoingCallReceiver接收OutgoingCallBroadcaster發過來的信息。
3. 接收廣播
1) OutgoingCallReceiver.java,爲BroadcastReceiver對象。
2) 在onRecive()方法中,通過Intent跳轉到新的Activity。由代碼“Intent newIntent = new Intent(Intent.ACTION_CALL, uri);”可知其參數爲Intent.ACTION_CALL。查找文件 Intent.java中參數聲明,可知ACTION_CALL=android.intent.action.CALL,通過查找Phone下面的androidmanifest.xml,知道OutgoingCallBroadcaster設置的幾項intent-filter的action name爲android.intent.action.CALL,OutgoingCallReceiver設置的一項intent-filter的action name爲android.intent.action.CALL。
3) 通過代碼語句“newIntent.setClass(context, InCallScreen.class);”可知其參數爲InCallScreen.class,故當前的Intent切換爲InCallScreen。通過代碼語句newIntent.startActivity(newIntent)激活InCallScreen Activity,故下一個將跳到InCallScreen界面。
4. 通話界面
1) InCallScreen.java,爲Activity對象。
1.1) 如果是第一次撥打電話,則調用onCreare()方法,該方法會調用initInCallScreen()方法,這樣將會創建一個通話界面。
1.2) 在onResume()方法中調用了isBluetoothAudioConnected(),setInCallScreenMode(),並創建了一個PhoneApp實例,調用該對象的updateWakeState()方法。
1.3) 在setInCallScreenMode()方法中調用了updateMenuButtonHint()方法。
1.4) 接下了執行getBitmapAccordingNumber()方法。(該方法或許是在handleMessage()方法下觸發的)
1.5) 再接着執行onPhoneStateChanged()方法。(該方法或許是在handleMessage()方法下觸發的),在該方法中調用了updateScreen()方法。
1.6) 在updateScreen()方法中順次調用了dismissMenu(),CallCard的updateState()方法,updateMenuButtonHint()方法。
2) CallCard.java,爲FrameLayout對象。
2.1) 該對象顯示了通話對方的信息和通話時間。
2.2) 在1.6)調用的updateState()方法中又實現了updateNoCall()操作。
2.3) 在updateNoCall()中,順次執行了了displayMainCallStatus(),displayOnHoldCallStatus(),displayOngoingCallStatus()方法。
3) PhoneApp.java,爲Application對象
3.1) 在1.5)執行的onPhoneStateChanged()方法,調用了updateWakeState()方法。
4) InCallScreen.java
4.1) onWindowFocusChanged()方法被執行。我不清楚這個是怎麼被觸發的,可能是由後臺控制程序來引發的。
4.2) 接下來執行internalResolveIntent()方法(該方法或許是在handleMessage()方法下觸發的),在該方法中調用了placeCall()方法。
4.3) 在4.2)執行的placeCall()方法中調用了checkIfOkToInitiateOutgoingCall()方法,以及isBluetoothAvailable()方法。
4.4) 再下來執行isBluetoothAudioConnected()方法。(該方法或許是在handleMessage()方法下觸發的),這裏與藍牙怎麼扯上了關係?
4.5) 再接着執行enableSensor()方法。(該方法或許是在onStop(),realFinish(),onClick(),handleMessage()方法下觸發的)應該是說有關傳感器的功能吧!
4.6) 再接着updateScreen()方法。(該方法或許是在placeCall(),handleMessage(),onDisConnect()方法下觸發的)
4.7) 再接着okToDialDTMFTones()方法。(該方法或許是在okToShowDialpad(),handleDialerKeyDown()下觸發的)
備註:前面這幾步沒有明顯地調用過程,所以我不知道到底怎麼跳轉的,或許是在後臺程序中控制好的。
5) PhoneUtils.java,爲一個類。
5.1) 在logcat中,顯示語句“- okToSwapCalls call state is : SINGLE_ACTIVE”,但是不知道怎麼跳到這裏的。
6) InCallScreen.java
6.1) isBluetoothAvailable()方法被調用,但是不知道是怎麼被調用到的。此外我不知道爲什麼需要調用藍牙功能,通話與這個功能有什麼關係。
6.2) updateScreen()方法被執行。該方法應該是後臺所控制執行的。我猜測既然上面做了很大一部分的變化工作,那麼屏幕做一下更新是所必須的。
7) CallCard.java
7.1) 由6.2)的updateScreen()方法調用,觸發了updateState()方法。
7.2) 在7.1)的updateState()方法中,又調用了updateForegroundCall()方法。
7.3) 由7.2)的updateForegroundCall()方法進一步執行了displayMainCallStatus()方法。
7.4) 由7.3)的displayMainCallStatus()方法引發了updateCardTitleWidgets()方法。
7.5) 由7.4)的updateCardTitleWidgets()方法引發了getTitleForCallCard()方法。
7.6) 由7.3)的displayMainCallStatus()方法引發了updateDisplayForPerson()方法。
7.7) 由7.3)的displayMainCallStatus()方法引發了updatePhotoForCallState()方法。
7.8) 由7.2)的updateForegroundCall()方法進一步執行了displayOnHoldCallStatus()方法。
7.9) 由7.2)的updateForegroundCall()方法進一步執行了displayOngoingCallStatus()方法。
8) InCallScreen.java
8.1) 由6.2)的updateScreen()方法調用,觸發了updateMenuButtonHint()方法。
8.2) 在8.1)的updateMenuButtonHint()方法中,又調用了getBitmapAccordingNumber()方法。
9) CallNotifier.java,爲一個Handle對象
9.1) onPhoneStateChanged()方法被執行。應該是由後臺進程來控制執行的。
10) InCallScreen.java
10.1) onPhoneStateChanged()方法被執行。應該是由後臺進程來控制執行的。
10.2) 由10.1)的onPhoneStateChanged()方法觸發了updateScreen()方法,使得開始執行4.6)到8.2)
11) PhoneApp.java
11.1) 由10.1)的onPhoneStateChanged()方法觸發了updateWakeState()方法。
12) 重複執行9)--11)兩次。持續對卡信息進行監聽。
發佈了25 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章