android通过intent呼叫号码一般都不返回intent发起者而是跑到通话记录里去,有些场合会带来麻烦,主要代码在
IncallScreen.java
电话挂断时 会交给onDisconnect()处理,会发送一个延时的消息DELAYED_CLEANUP_AFTER_DISCONNECT出来
int callEndedDisplayDelay =
(cause == Connection.DisconnectCause.LOCAL)
? CALL_ENDED_SHORT_DELAY : CALL_ENDED_LONG_DELAY;
mHandler.removeMessages(DELAYED_CLEANUP_AFTER_DISCONNECT);
mHandler.sendEmptyMessageDelayed(DELAYED_CLEANUP_AFTER_DISCONNECT,
callEndedDisplayDelay);
受到延时消息后会调用delayedCleanupAfterDisco
nnect();
case DELAYED_CLEANUP_AFTER_DISCONNECT:
delayedCleanupAfterDisco
nnect();
break;
delayedCleanupAfterDisco
nnect()里会去返回某个Activity()同时把自己放到stack的后面而不是destory()掉(onfinish()也被重写了去调用moveTaskToBack(true);而不是super.onfinish()),
final Intent intent = PhoneApp.createCallLogIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
这也就是为啥调用后跑到call log的原因,google本意是打完电话用户都期待去通话记录,可实际上很多程序不希望如此,
到了4.0以后这段代码被修正了
final Intent intent = mApp.createPhoneEndIntentUsin
gCallOrigin();
而在com.android.phone.PhoneApp里
public Intent createPhoneEndIntentUsin
gCallOrigin() {
if (TextUtils.equals(inCallUiState.latestActiveCallOrigin, ALLOWED_EXTRA_CALL_ORIGIN)) {
final Intent intent = new Intent();
intent.setClassName(DEFAULT_CALL_ORIGIN_PACKAGE, inCallUiState.latestActiveCallOrigin);
return intent;
} else {
return PhoneApp.createCallLogIntent();
}
}
在4.0版本前 有需要可以通过监听通话结束状态,把目标Activity start起来.
这里inCallUiState.latestActiveCallOrigin是从call intent 的extra里读出的,(
在拨号界面 有做这个处理 if (getActivity() instanceof DialtactsActivity) {
intent.putExtra(DialtactsActivity.EXTRA_CALL_ORIGIN,
DialtactsActivity.CALL_ORIGIN_DIALTACTS);
}
)
static
final
String
ALLOWED_EXTRA_CALL_ORIGIN
=
"com.android.contacts.activities.DialtactsActivity"
;
IncallScreen.java
电话挂断时 会交给onDisconnect()处理,会发送一个延时的消息DELAYED_CLEANUP_AFTER_DISCONNECT出来
int callEndedDisplayDelay =
受到延时消息后会调用delayedCleanupAfterDisco
case DELAYED_CLEANUP_AFTER_DISCONNECT:
delayedCleanupAfterDisco
final Intent intent = PhoneApp.createCallLogIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
这也就是为啥调用后跑到call log的原因,google本意是打完电话用户都期待去通话记录,可实际上很多程序不希望如此,
到了4.0以后这段代码被修正了
final Intent intent = mApp.createPhoneEndIntentUsin
而在com.android.phone.PhoneApp里
public Intent createPhoneEndIntentUsin
}
在4.0版本前 有需要可以通过监听通话结束状态,把目标Activity start起来.
这里inCallUiState.latestActiveCallOrigin是从call intent 的extra里读出的,(
在拨号界面 有做这个处理 if
}
)
不过从 privatepublic static final String EXTRA_CALL_ORIGIN = "com.android.phone.CALL_ORIGIN";
看,目前是有意识禁止返回"com.android.contacts.activities.DialtactsActivity"之外的activity,也许将来可以放宽这个限制.
当然可以定制rom的话可以自定义放宽这个限制。