Странное поведение жизненного цикла активности во время входящего звонка: отложено onStop () - PullRequest
0 голосов
/ 17 мая 2018

У меня есть простое действие без интерфейса.Я хотел проверить методы жизненного цикла действия во время вызова.

Когда приходит уведомление о вызове, ничего не происходит, как ожидалось.Когда я принимаю вызов, действие по вызову скрывает мою активность.Итак, в идеале onStop() должен быть вызван немедленно.Я проверил журналы, и только onPause() вызывается при принятии вызова.Но через 2-3 секунды onStop() также вызывается.

Активность

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "onPause: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: ");
    }
}

Манифест

   <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Журналы

05-17 22:10:25.025 E/MainActivity: onStart: 
05-17 22:10:25.054 E/MainActivity: onResume: 


When call has been accepted:
05-17 22:10:34.405 E/MainActivity: onPause: 

After 2-4 seconds:

05-17 22:10:38.144 E/MainActivity: onStop: 

Согласно документации из onStop():

Called when you are no longer visible to the user. You will next receive either onRestart(), onDestroy(), or nothing, depending on later user activity.

Здесь,другая деятельность покрывает мою деятельность и скрывает ее.Таким образом, onStop() должен быть вызван сразу после onPause().

Я тестировал его на устройстве Moto G4 и эмуляторе Nexus 5.Оба показывают одинаковое поведение.В чем причина задержки onStop () ?

Кто-нибудь может объяснить внутренние детали?

Скриншоты call is running

Ответы [ 5 ]

0 голосов
/ 28 мая 2018

Я думаю, что это больше связано с тем, как реализован дисплей вызовов.onPause вызывается, когда ваша деятельность больше не имеет основного фокуса на переднем плане, но все еще технически «видна».onStop вызывается, когда ваша активность больше не видна вообще.

Возможно, чтобы два действия имели видимое состояние, в результате чего только onPause был бы вызван для действия без фокуса.Отображение представления вызовов поверх вашей активности позволяет вашей активности оставаться «видимой», не полностью исчезая.Следовательно, почему onPause называется, а не onStop.

0 голосов
/ 28 мая 2018

Последовательность предсказуема и задокументирована в Запуск одного действия из другого

Координация действий:

Вот порядок операций, которые происходят, когда действие A запускает действие B:

  1. Метод действия onPause() выполняется.
  2. Методы действия onCreate(), onStart() и onResume() выполняются последовательно.(Действие B теперь имеет фокус пользователя.)
  3. Затем, если действие A больше не отображается на экране, выполняется его метод onStop().

По существу, появляющееся действиесоздается и полностью инициализируется между обратными вызовами onPause() и onStop() на исчезающем.Это может занять некоторое время, и метод onStop() может даже не быть вызван вообще, например, если новое действие использует стиль диалога (и, таким образом, старый все еще частично виден)

0 голосов
/ 22 мая 2018

Когда я принимаю вызов, активность для вызова скрывает мою активность. Таким образом, в идеале onStop () должен вызываться немедленно.

Прием вызова не удаляет активность из стека задачи и будет доступен после повторного ввода приложения => onPause () => onStop ().

Так вот почему onStop не вызывается сразу после получения вызова.

Цитата из Официальная документация

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

0 голосов
/ 23 мая 2018

Если вы открываете действие B поверх действия A, жизненный цикл будет таким:

  1. onPause активности A называется
  2. onСоздание активности B называется
  3. начало деятельности B называется
  4. onResume деятельности B называется Вызывается onStop активности A (за исключением частично видимой активности)
  5. В случае нехватки памяти на Дестрой активности А также можно назвать

Как вы можете видеть, существует много методов, вызываемых между паузой и остановкой действия A, отсюда и задержка

0 голосов
/ 22 мая 2018

На основании документации :

После получения вызова onPause() вы обычно получаете следующий вызов onStop () ( после следующего действиявозобновляется и отображается ), однако в в некоторых случаях будет прямой вызов onResume () без прохождения через остановленное состояние.

Хотя документация для onStop() немного сбивает с толку, он утверждает, что вызывает его, как только Activity больше не виден, но есть небольшая задержка, прежде чем он будет вызван (это зависит от отображения следующего действия).

В случае, если выПри получении звонка возникает тривиальная задержка, вызванная тем, что звонок выходит на передний планЯ также наблюдал эту задержку на своем личном телефоне.Эта задержка вызовет задержку вызова onStop().

...