Почему Android перезапускает приложение при выходе из Dialer? (или любой другой сервис)

У нас есть страница со ссылками на номер телефона (a href="tel:5551234567"), когда пользователь касается ссылки, он открывает номеронабиратель. После того, как пользователь завершит вызов и нанес ответный удар, вместо того, чтобы просто вернуть браузер, вы можете увидеть, что браузер перезапускается, поэтому страница перезагружается. Почему это происходит?

Вы можете легко загрузить этот URL-адрес (http://goo.gl/QKbrC9) на свое устройство и коснуться вызова ( 555) ссылка.

Спасибо,


person GDM    schedule 25.09.2013    source источник


Ответы (1)


Это поведение по умолчанию для Android.

Во время звонка вы перешли из приложения браузера в новое. Приложение для набора номера не знает о браузере, поэтому при нажатии «Назад» ОС 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;
                }


        }
    }

Но, очевидно, у браузера нет очевидной причины обрабатывать это специально.

person cYrixmorten    schedule 25.09.2013
comment
Это поведение такое же, если номеронабиратель вызывается из любого приложения? При возврате номеронабирателя вызывающее приложение перезапускается? - person GDM; 28.09.2013
comment
Нет. Если приложение предназначено для обработки телефонных звонков, как описано выше (что переупорядочивает действие приложения на передний план вместо создания нового) или как один запущенный экземпляр (это означает, что может быть запущено только одно такое действие), тогда возврат из телефонного звонка не приведет к созданию нового действия вместо исходного перед звонком. Игры, например, часто разрабатываются как последние, чтобы вы могли просто возобновить игру после завершения вызова. - person cYrixmorten; 28.09.2013
comment
Какие устройства вы тестировали? Просто пошел дальше и попытался позвонить с вашего сайта, чтобы проверить поведение и мой телефон (Samsung S2 CyanogenMod 10.1 Android 4.2.2), и он не перезагрузил страницу. Возможно, с более поздними версиями Android стал более умно справляться с такими ситуациями, с фрагментами и всем остальным. Мое обсуждение было основано на моих знаниях о поведении по умолчанию и опыте совершения телефонных звонков из моего приложения. Я использовал его для автоматического перенаправления номера на другой телефон, и мне пришлось выполнить приведенный выше код, чтобы вернуться в свое приложение. - person cYrixmorten; 28.09.2013
comment
Пробовал на своем телефоне Samsung Galaxy S3. Я где-то читал, что Android завершает процесс, когда требуется ресурс. Звучало так, что если номеронабирателю нужны ресурсы, браузер в этом случае закрывается, по возвращении начинает все заново. Я заметил, что это происходит (перезапуск браузера) только иногда. Во всяком случае, я попытался использовать браузер, чтобы сформулировать этот вопрос для более общего вопроса. Моя настоящая проблема заключается в том, что приложение Worklight (на самом деле приложение для Android) перезапускается после возврата из номеронабирателя. Похоже, это вообще не связано с Worklight, мне кажется, что это больше связано с поведением ОС. - person GDM; 01.10.2013