为什么Android在从拨号器返回时重新启动应用程序?(或任何其他服务)

为什么Android在从拨号器返回时重新启动应用程序?(或任何其他服务),android,resources,restart,tel,Android,Resources,Restart,Tel,我们有一个链接到电话号码的页面(a href=“tel:5551234567”),当用户触摸链接时,它会打开拨号器。在用户结束呼叫并回击后,您可以看到浏览器正在重新启动,因此页面正在重新加载,而不仅仅是返回浏览器。为什么会发生这种情况 您可以轻松地在设备中加载此URL(),然后触摸Call(555)链接 谢谢,这是Android的默认行为 通话时,您已移出浏览器应用程序,进入新的浏览器应用程序。拨号器应用程序对浏览器一无所知,因此当按下back时,Android操作系统将接管并启动浏览器应用程序

我们有一个链接到电话号码的页面(a href=“tel:5551234567”),当用户触摸链接时,它会打开拨号器。在用户结束呼叫并回击后,您可以看到浏览器正在重新启动,因此页面正在重新加载,而不仅仅是返回浏览器。为什么会发生这种情况

您可以轻松地在设备中加载此URL(),然后触摸Call(555)链接


谢谢,

这是Android的默认行为

通话时,您已移出浏览器应用程序,进入新的浏览器应用程序。拨号器应用程序对浏览器一无所知,因此当按下back时,Android操作系统将接管并启动浏览器应用程序。这将启动一个新的浏览器,然而,如果拨号程序知道该浏览器,它可以将其标记为重新排序到前面

也就是说,有可能让一个应用程序用类似以下的东西来对抗这种情况:

    private class EndCallListener extends PhoneStateListener {

    private final String LOG_TAG = "EndCallListener";

    private boolean isPhoneCalling = false;

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

        if (TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
            // finish();
        }
        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.
            Log.i(LOG_TAG, "OFFHOOK");
            isPhoneCalling = true;
        }
        if (TelephonyManager.CALL_STATE_IDLE == state) {

                // run when class initial and phone call ended,
                // need detect flag from CALL_STATE_OFFHOOK
                Log.i(LOG_TAG, "IDLE");

                if (isPhoneCalling) {

                    Log.i(LOG_TAG, "restart app");

                    // restart app
                    Intent i = getBaseContext().getPackageManager()
                            .getLaunchIntentForPackage(
                                    getBaseContext().getPackageName());
                    // i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    startActivity(i);

                    isPhoneCalling = false;
                }


        }
    }

但显然,浏览器没有明显的理由专门处理这个问题。

如果从任何应用程序调用拨号程序,这种行为是否相同?拨号器返回时,呼叫应用程序将重新启动?否。如果应用程序设计用于处理电话呼叫,如上所述(将应用程序活动重新排序到前端,而不是创建新的),或作为单个运行实例(意味着只能有一个此活动正在运行),然后,从电话呼叫返回不会导致在呼叫之前创建新活动来代替原始活动。例如,游戏通常被设计成后者,这样你就可以在结束通话后简单地恢复游戏。你测试过哪些设备?只是继续,并试图从你的网站打电话测试行为和我的手机(三星S2 CyanogenMod 10.1安卓4.2.2),但没有重新加载页面。也许随着更新版本的出现,安卓在处理这些情况时变得更聪明了,包括碎片和所有东西。。我的讨论是基于我对默认行为的了解和在我的应用程序中打电话的经验。我用它自动将号码重定向到另一部手机上,并且必须执行上述代码才能返回到我的应用程序。我在手机三星Galaxy S3上进行了尝试。我在某处读到安卓在需要资源时终止进程。听起来好像如果拨号器需要资源,在这种情况下,浏览器会关闭,返回后会重新启动。我注意到这种情况(浏览器重启)只是偶尔发生。无论如何,我试着用浏览器把这个问题表述成一个更一般的问题。我真正的问题是当Worklight应用程序(实际上是Android应用程序)从拨号器返回时重新启动。看起来它与Worklight一点关系都没有,对我来说,它更多的是关于操作系统的行为