我的主要活动有一个按钮,通过意图发起电话呼叫。我的应用程序然后有一个广播接收器,检测设备的电话状态何时变为“OFF_HOOK”。接收器然后向我的主要活动发送意图。我的主要活动(通过SYSTEM_TYPE_ERROR窗口布局参数“粘合”到显示)然后执行动画显示已启动调用。当呼叫结束时,广播接收器抓取“IDLE”电话状态,并向我的主要活动发送意图,以便我的主要活动可以收回动画以指示呼叫已结束。一些简单的代码:
广播接收器:
public void onReceive(Context context, Intent intent) {
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
if (stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
Intent newIntent = new Intent(context, MainActivity.class);
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// This flag allows the intent to be identified in the main activity
newIntent.putExtra(EXTRA_PHONE_STATE,PhoneStateReceiver.STATE_ENDED_INCOMING_CALL);
context.startActivity(newIntent);
}
}
主要活动:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
int phoneState = intent.getIntExtra(PhoneCallReceiver.EXTRA_PHONE_STATE, -1);
Log.d(TAG, "onNewIntent called with phoneState = " + phoneState);
setIntent(intent);
}
然后根据数据在onResume()中处理意图。
它在我的个人三星Galaxy S4运行Lollipop上运行完美,该Lollipop具有有效的电话服务。在我的旧的非活动手机(API 16上的Nexus S)和仿真器上,我尝试过API 18或19(显然也处于非活动状态且无法拨打电话),它在90%的情况下无法正常工作,甚至虽然我希望它可以正常工作,因为电话呼叫尝试(振铃和一切)导致标准电话服务错误消息,指出我的“帐户无法验证”。
在这些错误情况下,广播接收器接收电话状态更改,准备意图,并执行针对主要活动的context.startActivity(intent)。但是,主要活动很少得到应有的意图。相反,在电话呼叫错误消息完成且设备的电话应用程序结束之前,活动不会收到意图。只有这样,我的应用程序突然收到它正在等待表示已拨打电话的“OFF_HOOK”意图,并且在收到“IDLE”意图后立即收到表示呼叫已结束的意图。 “OFF_HOOK”意图以某种方式挂起。在其工作的10%的时间里,我怀疑在系统对我的活动施加某种冻结之前,其意图就是及时被解雇。
如果设备在没有锁定意图的有效服务帐户的情况下尝试拨打电话,设备是否会收到某种特殊的系统错误消息?