Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Существует ли onPause() без onStop()?

#android #activity #activity_life_cycle


В теории жизненного цикла Activity существует переход от onPause() к onResume(),
но ни эксперименты с запуском AlertDialog, ни входящий звонок на телефон во время исполнения
моего Activity, не дают сработки только onPause() без срабатывания onStop().
В какой реальной ситуации на практике происходит срабатывание только onPause() без
срабатывания onStop() и происходит ли вообще?
    


Ответы

Ответ 1



onPause() всегда вызывается (если с логикой программы всё нормально). onStop() может не вызваться, к примеру, если не хватает памяти. Это даже в документации сказано: Это метод может так и не вызваться, в ситуациях, когда не хватает памяти, чтобы продолжить работу вашего Activity после вызова onPause(). Так же метод finish() ломает логику и не позволяет вызваться нужным ивентам. Если вы напишите что-то такое: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); finish(); } @Override protected void onDestroy() { super.onDestroy(); Log.e("MainActivity", "onDestroy"); } @Override protected void onPause() { super.onPause(); Log.e("MainActivity", "onPause"); } @Override protected void onStop() { super.onStop(); Log.e("MainActivity", "onStop"); } То сработает только onDestroy(), а onPause() и onStop() нет.

Ответ 2



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

Комментариев нет:

Отправить комментарий