3

我从一个电话打了一个电话Activity,当电话结束时,我想回到应用程序。我尝试了 stackoverflow 上所有可用的解决方案。其中一个曾经工作几分钟,但现在不工作了。

我尝试使用recreate()成功调用onCreate方法Activity但应用程序不在前台的方法。我尝试使用各种标志,例如FLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_CLEAR_TASK, FLAG_ACTIVITY_NO_HISTORY. 但不起作用。

从调用应用程序返回应用程序的代码:

private class PhoneCallListener extends PhoneStateListener {

    private boolean isPhoneCalling = false;

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {

        // If call ringing
        if (state == TelephonyManager.CALL_STATE_RINGING) {

        }
        // Else if call active
        else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {

            isPhoneCalling = true;
        }
        // Else if call idle
        else if (state == TelephonyManager.CALL_STATE_IDLE) {

            if (isPhoneCalling) {

                isPhoneCalling = false;

                MyActivity.this.recreate();
            }
        }
    }
}
4

4 回答 4

1

这是我的解决方案,它在 4.3 上完美运行 - 其他操作系统版本尚未测试,但一切都应该没问题。

在以下位置注册侦听器MainActivity

TelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    listener = new ListenToPhoneState();
    tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

PhoneStateListener 来自MainActivty

private class ListenToPhoneState extends PhoneStateListener {

    private String LOG_TAG = "mainactivity";
    private boolean isCallFinished = false;

    public void onCallStateChanged(int state, String incomingNumber) {
        if (TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
        }
        if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
            // wait for phone to go offhook (probably set a boolean flag) so
            // you know your app initiated the call.
            isCallFinished = true;
            Log.i(LOG_TAG, "OFFHOOK");
        }
        if (TelephonyManager.CALL_STATE_IDLE == state) {
            // when this state occurs, and your flag is set, restart your
            // app
            if (isCallFinished) {
                isCallFinished = false;
                Intent i = new Intent(getApplicationContext(),
                        MainActivity.class);
                // this needs if you want some special action after the phone call 
                //ends, that is different from your normal lauch configuration
                i.setAction("SHOW_PHONE_CALL_LIST");
                startActivity(i);
                finish();
            }
            Log.i(LOG_TAG, "IDLE");
        }
    }

}

我从 a 开始打电话fragment,但这没有任何区别:

Uri uri = Uri.parse("tel:" + Uri.encode(callIt));
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
getActivity().finish();

您必须调用finish()启动呼叫的活动,否则在电话呼叫后,您的应用程序将保持默认的电话应用程序。

当您的应用程序启动时,您可以查看intent,并且可以设置您的呼叫后配置。在你的方法中调用它onCreate()

if (intent.getAction().equals("SHOW_PHONE_CALL_LIST")) {
        //perfom after call config here
    }

我希望一切都得到清楚的解释。

于 2013-08-23T09:09:00.810 回答
0

解决方案是启动一个extra包含在 bundle 中的应用程序,该应用程序是作为从任何其他应用程序返回的一部分启动的。

通话结束时,我使用以下代码启动应用程序:

// Launch app
Intent i = new Intent(ActivityThatMadeCall.this,
LauncherActivity.class);
i.putExtra("EXTRA_RETURNED_FROM_CALL_APP", true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);


然后在我的启动器活动中检查extra是否存在,如果它存在,则启动发出呼叫的活动。:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if(getIntent().getExtras().getString("EXTRA_RETURNED_FROM_CALL_APP") != null) {
        startActivity(new Intent(this, ActivityThatMadeCall.class));
    }
}
于 2013-08-22T17:38:28.967 回答
0
  1. 尝试修改您的代码,重要的东西不在 onCreate() 方法中,而是在 onResume() 方法中,因为当您从电话中回来时,不会触发 onCreate() 方法而是 onResume()方法。有关 Activity 生命周期的更多详细信息,请参阅http://developer.android.com/reference/android/app/Activity.html

  2. 如果这仍然没有帮助,请使用 flag Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

  3. 尝试使用来自侦听器的上下文。侦听器直接提供上下文(因此您可以调用startActivity(…)或调用getApplicationContext().startActivity(…)

最后你的代码应该是这样的:

Intent intent = new Intent(RS_HomeScreenActivity.this,RS_HomeScreenActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
于 2013-07-16T07:03:48.033 回答
0

我认为您必须使用广播接收器并在挂机时开始活动。您还需要声明读取手机状态的权限。

于 2013-07-16T06:57:57.770 回答