您的位置:首页 > 其它

activity与intent的关系

2015-03-26 09:39 169 查看
在我的apk中发出了这么一个intent :final Intent intent1 = new Intent(ACTION_DUAL_SIM_CALL, uri1);

然后在app里寻找 相应这个intent的activity:

<intent-filter>

<action android:name="com.intel.dualsim.ACTION_CALL" />

有三个在Phone里

<activity-alias android:name="PrivilegedOutgoingCallBroadcaster"

<activity android:name="OutgoingCallBroadcaster"

<activity-alias android:name="EmergencyOutgoingCallBroadcaster"

但是很可惜,看了log后发现那个选择用哪个phone的activity出现在outbroadcast之前,所以肯定不是Phone这个apk响应了这个intent而是别的activity,但是搜遍了所有的app发现还是这三个,说明这个选择的工作在原生的app里是在发这个intent之前就做了,于是就去看原生的app。

在DialpadFragment.java里发现了

case R.id.dialButton: {
Log.d("lisa","case R.id.dialButton:");
mHaptic.vibrate();  // Vibrate here too, just like we do for the regular keys

dialButtonPressed();
return;
}
case R.id.dialButton2: {
Log.d("lisa","case R.id.dialButton2:");
mHaptic.vibrate();
dialButtonPressed(DualSimConstants.DSDS_SLOT_2_ID);
return;
}
看dialButtonPressed(DualSimConstants.DSDS_SLOT_2_ID);

public void dialButtonPressed(int simIndex) {
if (isDigitsEmpty()) { // No number entered.
handleDialButtonClickWithEmptyDigits(simIndex);
} else {
final String number = mDigits.getText().toString();

// "persist.radio.otaspdial" is a temporary hack needed for one carrier's automated
// test equipment.
// TODO: clean it up.
if (number != null
&& !TextUtils.isEmpty(mProhibitedPhoneNumberRegexp)
&& number.matches(mProhibitedPhoneNumberRegexp)
&& (SystemProperties.getInt("persist.radio.otaspdial", 0) != 1)) {
Log.i(TAG, "The phone number is prohibited explicitly by a rule.");
if (getActivity() != null) {
DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
R.string.dialog_phone_call_prohibited_message);
dialogFragment.show(getFragmentManager(), "phone_prohibited_dialog");
}

// Clear the digits just in case.
mDigits.getText().clear();
} else {
final Intent intent;
if (mIsDualSimSupported) {
Log.d("lisa---","dialpadfragment");
intent = CallUtil.getDualSimCallIntent(number, simIndex,
(getActivity() instanceof DialtactsActivity ?
((DialtactsActivity)getActivity()).getCallOrigin() : null));
} else {
intent = CallUtil.getCallIntent(number,
(getActivity() instanceof DialtactsActivity ?
((DialtactsActivity)getActivity()).getCallOrigin() : null));
}
startActivity(intent);
mClearDigitsOnStop = true;
getActivity().finish();
}
}
}


看起来和之前一样,并没有在intent里多加东西,所以说确实是在发intent之前就初始化phone。

而且验证得出的结论,挂电话和哪个phone没有关系,也就是选任意的com.android.phone都可以挂电话,但是和sim卡放在1还是2的位子上相关,也就是如果是在sim卡1插槽里的话,挂电话就必须用 matt=CallManager.getInstance();而卡2就必须用matt1 = CallManager.getInstance2();

查看这个intent被谁接受,结果在Phone的xml里发现有三个activity都接收,我们需要指定一个

于是对intent做了修改 intent1.setClassName("com.android.phone", "com.android.phone.OutgoingCallBroadcaster");

指定了activity的名字就可以避开选择哪个phone,但是原生的代码是如何解决这个问题的还需要研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: