Подтвердить что ты не робот

Сведения об уничтожении и отдыхе компонентов приложений Android

Может ли кто-то подтолкнуть меня к какой-то конкретной, заслуживающей доверия (и желательно краткой) информации о следующем:

  • Порядок, в котором компоненты уничтожаются и (если применимо) воссозданы системой (Fragment, Activity, Activity Threads/AsyncTasks/Timers, статические данные (когда классы разгружаются?), Threads/AsyncTasks/Timers в других классах, хост TabActivity, ActivityGroup, связанные локальные службы, приложение, процесс) как в приложении, так и на переднем плане.
    В каких точках разрушение может прекратиться (какие состояния могут возникнуть после возврата к приложению - вроде "все, включая объект приложения разрушен, процесс жив "?

  • Возможно ли (без модификации Android) программно вызвать такой же тип разрушения сами, так что он неотличим от того, когда система делает это, или является отдельным механизмом, необходимым для того, когда мы сами выбираем свободную память (вызванную onLowMemory)?

  • Надежные этапы воспроизведения всех сценариев из 1) (будет ли junit.framework делать? Я этого не исследовал)?

  • "Если пользователь оставляет задачу в течение длительного времени, система очищает задачу всех действий, кроме корневой активности. Когда пользователь снова возвращается к задаче, восстанавливается только корневая активность": это помимо процесса/компонента жизненного цикла/уничтожения или привязанного к нему?

Я читал различные источники, давая фрагменты информации, часто неполные и вводящие в заблуждение, иногда неверные. Я признаю, что я просмотрел некоторые части документации, поэтому я, возможно, пропустил или неправильно понял что-то.
[EDIT] Во избежание недоразумений: о чем я спрашиваю, это Android, уничтожающий компоненты для освобождения памяти, минуя Activity.onDestroy.
Когда я поставлю приложение в фоновом режиме и вернусь позже, произойдет одно из следующих последовательностей:

  • onPause, onStop, onRestart, onStart, onResume
  • onPause, onStop, Application.onCreate, onCreate (notNull), onStart, onResume

[EDIT2] Началась Баунти. Нужна достоверная информация о: деятельности, фрагментах, приложении, связанных (потенциально удаленных) службах, процессах.
Частичные/полные сценарии уничтожения. См. 1-й пункт.

4b9b3361

Ответ 1

Кредит для этого идет hackbod для написания здесь (прочитайте весь ответ), и CommonsWare для ссылки в комментарии.

Короче: все docs, переписанные много раз, продолжают врать нам. Они не вводят в заблуждение, они просто дают нам неверную информацию. Если вы не используете Fragments (dunno, если подсчет поддержки v4 тоже), Android освобождает память, убивая весь процесс или ничего не делает.

Конечно, это не касается всего:

  • Пункт 4 вопроса
  • Почему я часто видел onCreate (notNull) при нажатии Back на стек Activity с Activity, обрабатывающей все изменения конфигурации (Android 2.3.7).
  • Как это относится к общепринятому убеждению, что onPause - это последний звонок, который вы обязательно получите, и onStop никогда не сможет получить вызов (как же тогда приложение может перейти на задний план, чтобы быть убитым?)

Мы все-таки попадаем.

Ответ 2

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

Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show();

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

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);

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

Ответ 3

Это то, что мой опыт и опыт разработчиков, которые я задал, похоже, предлагают:

    • Фрагменты не автообновлены.
    • невидимые действия в стеке приложения могут быть автообновлены в любом порядке и в любом количестве.
    • destroy (или любой другой класс) Нити и статика остаются нетронутыми до тех пор, пока приложение не будет уничтожено.
    • TimerTasks: не тестировались.
    • Связанные локальные службы: уничтожены где-то между уничтожением последней привязки и приложения.
    • Приложение - это последнее, что нужно сделать в процессе, и "идет" вместе со всеми Threads.
    • процесс может существовать в течение длительного (20 + минут) времени после уничтожения объекта Application, если у вас нет автоматического убийцы задачи.
    • Действия под TabActivity или в ActivityGroups не автообновляются, а идут все сразу, если контейнер уничтожен.
      Пример: TabActivity с ActivityGroups под вкладками. Все мероприятия живут. Начато другое действие, полноэкранное. TabActivity со всем, что в нем, теперь имеет право на уничтожение Android, все сразу или вовсе.
  • NO.
    Если вы уничтожаете действие вручную, оно проходит весь жизненный цикл и не передает пакет в onCreate при запуске снова.
    Кроме того, onLowmemory ненадежна - даже с небольшими шагами выделения, она никогда не может быть вызвана до того, как будет выпущен OutOfMemoryError.
  • NO.
    Несмотря на то, что автодеструкция/восстановление является такой важной особенностью в Android, нет никакого способа проверить такие сценарии.
  • Вероятно, это связано только с тем, существует ли процесс еще или нет. Если это произойдет, Android попытается восстановить старые действия. Если нет, это чистый перезапуск.

Вышеупомянутые включают некоторые предположения.
Я все еще жду, чтобы кто-то подтвердил это и предоставил некоторые документы (гарантии не зависят от текущей реализации классов).
Пожалуйста, ПОЖАЛУЙСТА, исправьте меня, если это не так.
Изменить: приведенная выше информация может быть устаревшей, она была протестирована на Android 2.1-2.3

Ответ 4

Хорошо, мой друг, Думаю, у вас будет много проблем в ваших исследованиях. В основном потому, что вы говорите о двух черных ящиках: сборщик мусора Dalvik и менеджер кучи андроидов. Я бы сказал, что вы не можете доверять тому, что андроид будет следовать любому порядку уничтожения объекта. Но вы можете верить, что этот жизненный цикл будет следовать [Programming Android, 2011]:

Жизненный цикл деятельности:

onCreate() - Called after the instance of the activity has been created for the first  time
onRestart() - Called after an activity has been interrupted, just before the onStart();
onStart() - Called when the object activity and their visions become visible to the user;
onResume()-  Called when the object activity and their visions become interactive to the user;
onPause() - Called when a different instance of the activity is going to get visible and the present activity ceases to interact with the user
onStop() - Called when the activity is no longer visible or is not interacting
onDestroy() - Called when an activity instance must be destroyed and it no longer needed. 

Фрагменты имеют разные жизненные циклы, включая методы onAttach, onCreateView и onActivityCreated. Но почему вас беспокоит порядок уничтожения предметов? Я не вижу причин для наблюдения за такими событиями, но если вам действительно нужно, узнайте больше об сборщике мусора.

Ответ 5

  • Метод ActivityManagerService # trimApplications() удаляет все неиспользуемые процессы приложения, если текущий приемник приложения имеет значение null, не имеет активности и службы.

Ответ 6

Когда дело доходит до действий, они будут уничтожены только в Destroy() до тех пор, пока разработчик не вызовет вручную функцию finish(),

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

Задачи таймера завершат работу и становятся кандидатами на сбор мусора, как только действие создает их, задача запускается в своем потоке, не имеет отношения к активности, даже если действие уничтожается, задача завершается самой...