Intereting Posts
GridView.setOnItemClickListener не работает Аутентификация приложения Android или iPhone в бэкэнде Django Значки функций Google Play не отображаются в google play Плененный портал на Android-устройстве Диалог PopUp Android из фонового потока FindViewById в пользовательском представлении, чтобы найти дочерний вид GSON выбрасывает «Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY»? GSON: сериализовать одиночное нулевое поле без использования глобального serializeNulls () Android: автозаполнение Google Места. Как я могу использовать его для заполнения RecyclerView, а не в раскрывающемся меню? Изменить формат даты строки и установить в TextView в Android? Android: Каков ключ для получения цвета фона контакта? Не удалось показать элементы в библиотеке AppCompat Как программно включить GPS в Android Cupcake Как проверить активность на переднем плане или на видимом фоне? Должен ли я использовать класс AsyncTask внутри основной деятельности MainActivity?

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

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

  1. Порядок, в котором компоненты уничтожаются и (если применимо) воссозданы системой (фрагмент, активность, потоки активности / AsyncTasks / Timers, статические данные (когда классы разгружаются?), Темы / AsyncTasks / Timers в других классах, host TabActivity, ActivityGroup, связанные локальные службы, приложение, процесс), когда приложение находится в фоновом режиме и на переднем плане.
    В каких точках разрушение может прекратиться (какие состояния могут возникнуть при возврате в приложение – вроде «все, включая объект приложения, уничтоженный, процесс живой»?

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

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

  4. « Если пользователь оставляет задачу в течение длительного времени, система очищает задачу всех действий, кроме корневой активности. Когда пользователь снова возвращается к задаче, восстанавливается только корневая активность »: это помимо процесса / компонента Жизненного цикла / разрушения или привязаны к нему?

Я читал различные источники, давая фрагменты информации, часто неполные и вводящие в заблуждение, иногда неправильные.
Я признаю, что я просмотрел некоторые части документации, поэтому я, возможно, пропустил или неправильно понял что-то.

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

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

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

Solutions Collecting From Web of "Сведения об уничтожении и отдыхе компонентов приложений Android"

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

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

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

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

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

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

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

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

Изменить: вышеуказанная информация может быть устаревшей, она была протестирована на Android 2.1-2.3

Ну, мой друг, я думаю, у вас будет много проблем в ваших исследованиях. В основном потому, что вы говорите о двух черных ящиках: сборщик мусора 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's no longer needed. 

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

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

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

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

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

Это не полный ответ, но я бы порекомендовал вам, что вы размещаете тосты в каждом из этих методов. Добавьте в свои собственные 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() .