Вопрос

Кто-нибудь может дать краткий обзор случаев, когда и как действие прерывается средой выполнения?Я хотел бы знать разницу между приостановленным и остановленным состоянием.Что может заставить систему уничтожить приостановленное действие по точно такой же причине (нехватка памяти), как если бы оно было остановлено?

Я думаю, что если действие приостановлено из-за входящего телефонного звонка (который внезапно приводит к нехватке памяти), система просто предпочитает высвобождать ресурсы остановленных действий.Но как это делается?Когда система "любезно запрашивает" действие, вызывая функцию finish(), а когда нет, и когда onDestroy() все еще вызывается?

Это было полезно?

Решение

Большая часть того, что вы спросили, довольно хорошо описана в документации, но я думаю, что могу прояснить пару вещей.

Я хотел бы знать разницу между приостановленным и остановленным состоянием.

Видимость.Эти два состояния различны, потому что приостановленное действие может быть лишь частично скрыто другим действием, например, тем, у которого Dialog тема применена.Это требует сохранения всех ресурсов, необходимых для поддержания визуального состояния.Остановленные действия могут привести к выбросу за борт тех ресурсов, которые могут повлиять на то, будут ли действия уничтожены или сохранены, если ресурсы ограничены.

Я думаю ...система просто предпочитает высвобождать ресурсы остановленных действий.Но как это делается?

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

Когда система "любезно запрашивает" действие , вызывая функцию finish(), а когда нет, и когда onDestroy() все еще вызывается?

Система произведет упорядоченное уничтожение, когда сможет, но API гарантирует только то, что действие когда-либо увидит onPause() и onSaveInstanceState().

ETA:Точные причины, по которым действия удаляются из стека, указаны в исходном коде.Вы не должны полагаться на то, что эти причины являются универсальной истиной, потому что в будущей версии Android могут появиться другие решения.

Другие советы

В порядке вещей, я вижу!Я вижу некоторую ценную информацию, смешанную с дорогостоящей дезинформацией.Нет, в онлайн-документах НЕ всегда точно указано, при каких обстоятельствах процесс будет остановлен.Это сделано намеренно, поскольку оно может быть изменено без предварительного уведомления.Конечно, наиболее распространенной причиной вызова onDestroy() является то, что в системе заканчивается память, что реже встречается на новых телефонах (поскольку у них так много памяти).Но нет никакой гарантии, что это ЕДИНСТВЕННАЯ причина, по которой он вызывается.

Но да, "контракт" между Android и разработчиками заключается в том, что если вы будете следовать правилам, реализуя необходимые обратные вызовы жизненного цикла, когда они необходимы, тогда это сработает, и вам не нужно точно знать, при каких обстоятельствах вызываются onStop(), onSaveInstanceState() и onDestroy().

Теперь, в отличие от Google, я признаю, что формулировка контракта в некоторых пунктах несколько расплывчата.Это происходит потому, что, помимо других меньших причин, они используют термины, которые имеют стандартное отраслевое значение, такие как "передний план", но они используют их в несколько измененном значении.И это изменение либо никогда не объясняется, либо объясняется только в неясных местах.Также не помогает то, что диаграмма претендует на то, чтобы показать "пути, которые действие может проходить между состояниями", но не показывает, что onDestroy() может вызываться много раз, даже минуя переход от возобновленного к остановленному.Тем не менее, в тексте четко описывается такая возможность.

Вот почему, к сожалению, чтения раздела жизненного цикла приложения "Основы применения" просто недостаточно.Вместо этого необходимо также прочитать Javadoc для КАЖДОГО из обратных вызовов в разделе for Activity, а также раздел "Основы приложения", посвященный процессам.

После этого чрезвычайно полезно поместить операторы Log.d в каждый из обратных вызовов и наблюдать за выводом logcat во время циклического прохождения вашего приложения по жизненному циклу.Но даже в этом случае не полагайтесь на события жизненного цикла, происходящие в том порядке, который вы видите в logcat, если только вы не можете найти обоснование этому в одном из упомянутых выше онлайн-документов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top