我认为你在这里混淆了一些东西(活动Intent
和广播Intent
)。让我试着帮忙。
当你这样做时:
Intent dialIntent = new Intent(Intent.ACTION_CALL, phoneNumber);
startActivity(dialIntent);
这会导致 Android 寻找Activity
已宣传他们可以处理的可用 s ACTION_CALL
。标准的 Android 拨号器就是其中之一,但手机上可能还安装了其他拨号器。如果只有一个,则启动该 Activity。如果有多个,则向用户显示可能的活动列表,并且用户可以选择他想要使用的活动。Intent
如果您发送的是隐式Intent(即:未指定组件),则您无法控制此行为。
现在让我们假设选择了标准的 Android 拨号器应用程序。它使用 发送有序广播Intent.ACTION_NEW_OUTGOING_CALL
。此广播将按顺序发送给所有BroadcastReceiver
已注册此广播的 s。这使这些组件有机会修改号码、拨打号码或阻止呼叫。您也无法控制此行为。
要强制使用标准 Android 拨号器,您需要使用显式Intent(即:指定组件名称)。问题是每个制造商和/或移动运营商都可以提供一个自定义拨号器,而不是标准的 Android 拨号器,因此这不适用于所有手机。
然而,正如我之前所说,即使您可以确定标准的 Android 拨号器会启动,它仍然会发送有序广播,允许其他组件修改、拨号或阻止呼叫。