2013-09-25 1 views
0

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

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

Thanks,

ответ

1

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

Когда вызов происходит, вы переместились за пределы приложения-браузера и в новый. Приложение-дозвон не имеет представления о браузере, поэтому при нажатии на него ОС Android берет на себя и запускает приложение-браузер. Это запустит новый браузер, тогда как если дозвонитель знал о браузере, он может помечать его переупорядочению на фронт.

Это сказанное, можно сделать приложение счетчика это с Somthing как:

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; 
       } 


     } 
    } 

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

+0

Это поведение одинаково, если вызывающий абонент вызывается из любого приложения? При возврате вызывающего устройства перезапуск? – GDM

+0

Нет. Если приложение предназначено для обработки телефонных звонков, как описано выше (которое переупорядочивает активность приложения перед фронтом вместо создания нового) или как один запущенный экземпляр (что означает, что может быть только один из этих действий) , то возврат из phonecall не приведет к созданию нового действия вместо оригинала перед вызовом. Игры, например, часто разрабатываются как последние, так что вы можете просто возобновить игру после завершения вызова. – cYrixmorten

+0

Какие устройства вы проверили? Просто пошел дальше и фактически попробовал позвонить с вашего сайта, чтобы проверить поведение и мой телефон (Samsung S2 CyanogenMod 10.1 Android 4.2.2), и он не перезагрузил страницу. Возможно, с более поздними версиями Android стал более умным в этих ситуациях, с фрагментами и всеми. Моя дискуссия была основана на моих знаниях о поведении и опыте работы с созданием фонотеков из моего приложения. Я использовал его для автоматического перенаправления номера на другой телефон и должен был выполнить приведенный выше код, чтобы вернуться к моему приложению. – cYrixmorten