android Telephony學(xué)習(xí) --- 第六篇 android7.0 MO InCallActivity啟動流程

我們先看下7.0啟動InCallActivity時序圖:

android incall UI啟動流程.png

還記得上篇講的*號標(biāo)記的地方么,對CallIntentProcessor里調(diào)用CallsManager的startOutgoingCall方法,我們從這里開始分析:

// Send to CallsManager to ensure the InCallUI gets kicked off before the broadcast returns
Call call = callsManager.startOutgoingCall(handle, phoneAccountHandle, clientExtras, initiatingUser);
  • packages/services/Telecomm – CallsManager
if (!mCalls.contains(call) && mPendingMOEmerCall == null) {
   // We check if mCalls already contains the call because we could potentially be reusing
   // a call which was previously added (See {@link #reuseOutgoingCall}).
   addCall(call);
        }

去尋找監(jiān)聽CallsManagerListener的onCallAdded方法:

    private void addCall(Call call) {
        for (CallsManagerListener listener : mListeners) {
            listener.onCallAdded(call);
        }    
    }        
  • packages/services/Telecomm – InCallController
   @Override
    public void onCallAdded(Call call) {
        if (!isBoundToServices()) {
            bindToServices(call);
        }
    }

來看關(guān)鍵代碼哈雏,綁定InCallService:

            Intent intent = new Intent(InCallService.SERVICE_INTERFACE);
            intent.setComponent(mInCallServiceInfo.getComponentName());
            if (call != null && !call.isIncoming() && !call.isExternalCall()){
                intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS,
                        call.getIntentExtras());
                intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
                        call.getTargetPhoneAccount());
            }

            Log.i(this, "Attempting to bind to InCall %s, with %s", mInCallServiceInfo, intent);
            mIsConnected = true;
            if (!mContext.bindServiceAsUser(intent, mServiceConnection,
                        Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE |
                        Context.BIND_ABOVE_CLIENT,
                        UserHandle.CURRENT)) {
                Log.w(this, "Failed to connect.");
                mIsConnected = false;
            }

查看mServiceConnection的onServiceConnected方法:

private class InCallServiceBindingConnection extends InCallServiceConnection {

        private final ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                synchronized (mLock) {
                    try {
                        mIsBound = true;
                        if (mIsConnected) {
                            // Only proceed if we are supposed to be connected.
                            onConnected(service);
                        }
                    } 
                }
            }

onConnected方法:

        protected void onConnected(IBinder service) {
            boolean shouldRemainConnected =
                    InCallController.this.onConnected(mInCallServiceInfo, service);
        }

先找到aidl IInCallService對應(yīng)的接收端季春,并找到方法addCall:

  private boolean onConnected(InCallServiceInfo info, IBinder service) {
        IInCallService inCallService = IInCallService.Stub.asInterface(service);
        mInCallServices.put(info, inCallService);
        try {
            inCallService.setInCallAdapter(
                    new InCallAdapter(
                            mCallsManager,
                            mCallIdMapper,
                            mLock,
                            info.getComponentName().getPackageName()));
        } 
        
        for (Call call : calls) {
            try {
                // Track the call if we don't already know about it.
                addCall(call);
                numCallsSent += 1;
                inCallService.addCall(ParcelableCallUtils.toParcelableCall(
                        call,
                        true /* includeVideoProvider */,
                        mCallsManager.getPhoneAccountRegistrar(),
                        info.isExternalCallsSupported()));
            } catch (RemoteException ignored) {
            }
        }
  • packages/services/Telecomm – InCallService
    private final class InCallServiceBinder extends IInCallService.Stub {
        @Override
        public void addCall(ParcelableCall call) {
            mHandler.obtainMessage(MSG_ADD_CALL, call).sendToTarget();
        }
  • frameworks/base/telecomm -- Phone
    去找監(jiān)聽的代碼赢织,找到onCallAdded方法:
    private void fireCallAdded(Call call) {
        for (Listener listener : mListeners) {
            listener.onCallAdded(this, call);
        }
    }
  • packages/services/Telecomm – InCallService
    繞了一下萌朱,又回到了InCallService睦焕,并去尋找InCallService的子類:
 private Phone.Listener mPhoneListener = new Phone.Listener() {
        /** ${inheritDoc} */
        @Override
        public void onCallAdded(Phone phone, Call call) {
            InCallService.this.onCallAdded(call);
        }

  • packages/app/Dialer – InCallServiceImpl

InCallServiceImpl extends InCallService

    @Override
    public void onCallAdded(Call call) {
        InCallPresenter.getInstance().onCallAdded(call);
    }
  • packages/app/Dialer – InCallPresenter
    public void onCallAdded(final android.telecom.Call call) {
        if (shouldAttemptBlocking(call)) {
            maybeBlockCall(call);
        } else {
                mCallList.onCallAdded(call);
        }
    }
  • packages/app/Dialer – CallList
    需要找到實(shí)現(xiàn)監(jiān)聽implements CallList.Listener狠毯,實(shí)現(xiàn)方法onCallListChange的地方:
    private void notifyGenericListeners() {
        for (Listener listener : mListeners) {
            listener.onCallListChange(this);
        }
    }
  • packages/app/Dialer – InCallPresenter

startOrFinishUi

    public void onCallListChange(CallList callList) {
        InCallState newState = getPotentialStateFromCallList(callList);
        InCallState oldState = mInCallState;
        newState = startOrFinishUi(newState);

啟動InCallActivity:

    public void showInCall(final boolean showDialpad, final boolean newOutgoingCall) {
        Log.i(this, "Showing InCallActivity");
        mContext.startActivity(getInCallIntent(showDialpad, newOutgoingCall));
    }

到這為止护糖,呼出InCallActivity啟動的流程基本結(jié)束了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚼松,一起剝皮案震驚了整個濱河市嫡良,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌献酗,老刑警劉巖寝受,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罕偎,居然都是意外死亡很澄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門颜及,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甩苛,“玉大人,你說我怎么就攤上這事器予±嗽澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵乾翔,是天一觀的道長爱葵。 經(jīng)常有香客問我施戴,道長,這世上最難降的妖魔是什么萌丈? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任赞哗,我火速辦了婚禮,結(jié)果婚禮上辆雾,老公的妹妹穿的比我還像新娘肪笋。我一直安慰自己,他們只是感情好度迂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布藤乙。 她就那樣靜靜地躺著,像睡著了一般惭墓。 火紅的嫁衣襯著肌膚如雪坛梁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天腊凶,我揣著相機(jī)與錄音划咐,去河邊找鬼。 笑死钧萍,一個胖子當(dāng)著我的面吹牛褐缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播风瘦,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼队魏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弛秋?” 一聲冷哼從身側(cè)響起器躏,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蟹略,沒想到半個月后登失,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挖炬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年揽浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片意敛。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡馅巷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出草姻,到底是詐尸還是另有隱情钓猬,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布撩独,位于F島的核電站敞曹,受9級特大地震影響账月,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澳迫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一局齿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橄登,春花似錦抓歼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至面褐,卻和暖如春拌禾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背展哭。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闻蛀,地道東北人匪傍。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像觉痛,于是被迫代替她去往敵國和親役衡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容