去电界面启动分析---之二
2017-08-16 21:54
113 查看
1.3启动去电界面
在InCallController的onCallAdded方法中有关去电界面的代码如下,inCallService.addCall(parcelableCall);
通过binder跨进程调用Incall 的InCallService内部类InCallServiceBinder的addCall方法,
public void addCall(ParcelableCall call) { mHandler.obtainMessage(MSG_ADD_CALL, call).sendToTarget(); }
mHandler的handleMessage对MSG_ADD_CALL消息处理如下,
case MSG_ADD_CALL: mPhone.internalAddCall((ParcelableCall) msg.obj); break;
此时实际上运行于dailer进程中, Phone的internalAddCall方法调用流程图如下,
Phone的internalAddCall方法如下,
final void internalAddCall(ParcelableCall parcelableCall) { Call call = new Call(this, parcelableCall.getId(), mInCallAdapter, parcelableCall.getState(), parcelableCall.isActive()); mCallByTelecomCallId.put(parcelableCall.getId(), call); mCalls.add(call); checkCallTree(parcelableCall); call.internalUpdate(parcelableCall, mCallByTelecomCallId); fireCallAdded(call); }
fireCallAdded方法如下,
private void fireCallAdded(Call call) { for (Listener listener : mListeners) { listener.onCallAdded(this, call); } }
Listener监听器是Phone的内部接口,
变量mListeners list中保存着所有注册的监听器,
private final List<Listener> mListeners = new CopyOnWriteArrayList<>();
调用addListener方法添加监听器,
public final void addListener(Listener listener) { mListeners.add(listener); }
在此,会回调InCallService的匿名Phone.Listener的onCallAdded方法,
是在设置InCallAdapter过程中处理MSG_SET_IN_CALL_ADAPTER消息时注册监听器的,
case MSG_SET_IN_CALL_ADAPTER: mPhone = new Phone(new InCallAdapter((IInCallAdapter) msg.obj)); mPhone.addListener(mPhoneListener);//注册监听器 onPhoneCreated(mPhone); break;
Phone.Listener的onCallAdded方法如下,
public void onCallAdded(Phone phone, Call call) { InCallService.this.onCallAdded(call); }
onCallAdded在子类InCallServiceImpl中实现,如下,
public void onCallAdded(Call call) { CallList.getInstance().onCallAdded(call); InCallPresenter.getInstance().onCallAdded(call); }
CallList的onCallAdded方法如下,
public void onCallAdded(android.telecom.Call telecommCall) { Trace.beginSection("onCallAdded"); Call call = new Call(telecommCall);//构造call对象 Log.d(this, "onCallAdded: callState=" + call.getState()); if (call.getState() == Call.State.INCOMING || call.getState() == Call.State.CALL_WAITING) { onIncoming(call, call.getCannedSmsResponses());//如果是来电 } else { onUpdate(call);//更新call } Trace.endSection(); }
notifyGenericListeners方法如下,
private void notifyGenericListeners() { for (Listener listener : mListeners) { listener.onCallListChange(this); } }
Listener 监听器也是CallList的接口,也是在addListener方法中注册,
public void addListener(Listener listener) { Preconditions.checkNotNull(listener); mListeners.add(listener); // Let the listener know about the active calls immediately. listener.onCallListChange(this); }
InCallPresenter实现了CallList.Listener接口,
public class InCallPresenter implements CallList.Listener,
并且在setUp方法中调用CallList的addListener方法注册监听器,
mCallList.addListener(this);
在InCallPresenter的startOrFinishUi方法中,会进行各种判断,其中,来电的有关代码如下,
if (showCallUi || showAccountPicker || isAutoAnswer) { Log.i(this, "Start in call UI"); showInCall(false /* showDialpad */, !showAccountPicker /* newOutgoingCall */);
showInCall方法如下,
public void showInCall(final boolean showDialpad, final boolean newOutgoingCall) { Log.i(this, "Showing InCallActivity"); mContext.startActivity(getInCallIntent(showDialpad, newOutgoingCall)); }
getInCallIntent方法如下,
public Intent getInCallIntent(boolean showDialpad, boolean newOutgoingCall) { final Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClass(mContext, InCallActivity.class); if (showDialpad) { intent.putExtra(InCallActivity.SHOW_DIALPAD_EXTRA, true); } intent.putExtra(InCallActivity.NEW_OUTGOING_CALL_EXTRA, newOutgoingCall); return intent; }
因此,启动的是InCallActivity来显示来电界面,这样,转了这么久,来电界面终于显示出来了。至于去电界面的具体view在此就不论述了。
Dialer的AndroidManifest.xml有关InCallActivity如下,
<activity android:name="com.android.incallui.InCallActivity" android:theme="@style/Theme.InCallScreen" android:label="@string/phoneAppLabel" android:excludeFromRecents="true" android:launchMode="singleInstance" android:configChanges="keyboardHidden" android:exported="false" android:screenOrientation="nosensor" > </activity>
相关文章推荐
- Activity的启动模式分析-之二
- 环信UI开源Demo情景分析三、启动界面
- 4412uboot启动过程分析之二
- Android x86如何启动到图形界面 device/generic/common/init.sh 分析
- uboot启动流程分析之二
- Android应用启动界面分析(Starting Window)
- Mesos源码分析(3): Mesos Master的启动之二
- Mesos源码分析(3): Mesos Master的启动之二
- Android编程实现启动界面的方法分析
- launcher界面点击应用图标启动Activity流程分析
- Linux kernel 分析之二:main函数执行启动过程
- 学习 uboot 之二启动代码start.S分析
- [Android]开源中国源码分析之一---启动界面
- zookeeper源码分析之二客户端启动
- 去电界面启动分析---之一
- Android启动流程分析之二:内核的引导
- u-boot启动第二阶段以及界面命令分析
- Android5.1Telecomm层通话去电流程两路进程分析之二拨号过程显示通话界面过程分析
- 开源中国 OsChina Android 客户端源码分析(1)启动界面 app_start
- google 分屏 横屏模式 按home键界面错乱故障分析(二) 分屏的启动过程