2016-04-13 2 views
2

Будет onCreate вызывается после onStop без onDestroy посередине?Будет onCreate вызван после onStop без onDestroy в середине

На картинке ниже ответ ДА.

Activity Life Cycle

Но в same page, он говорит:

защищен недействительным OnStop()
не Вызывается, когда вы больше не видны пользователя. В дальнейшем вы получите либо onRestart(), onDestroy(), либо ничего, в зависимости от более поздней активности пользователя.

Мое приложение должно запускать фоновое задание, даже если пользователь уйдет в другое приложение или выключит экран. Единственная ситуация, когда задача должна быть остановлена, заключается в том, что приложение полностью закрыто. Поэтому я создаю и запускаю фоновый поток в onCreate() и останавливаю его в onDestroy(). Проблема, с которой я сталкиваюсь, заключается в том, что иногда в одном потоке работает более одного потока. Это часто случается, когда я оставляю свое приложение в течение долгого времени, а затем обратно. Я думаю, это может быть связано с несколькими звонками onCreate(). Как его решить?

ответ

4

Будет ли onCreate вызываться после onStop без onDestroy посередине?

Короткий ответ: Нет

Длинный ответ:

onCreate не будет вызываться, если только onStop был вызван на activity. После onStop, если пользователь перейдет к действию, это будет onStart (до этого будет называться onRestart).

enter image description here

Теперь позвольте мне объяснить, как onCreate будет называться после onStop без onDestroy называют.

Для этого вы должны смотреть на этой приоритетной иерархии процесса в андроиде:

enter image description here

активности остается в переднем плане процессов от времени onResume было названо, но не была вызвана , И поскольку приоритетные процессы имеют наивысший приоритет, он не будет убит.

не вызывается, когда пользователь больше не сможет взаимодействовать с activity но VISIBLE. Пример: когда вы открываете DialogFragment над действительностью. Затем процесс активности перемещается в видимый процесс. Это имеет меньший приоритет, чем процесс переднего плана, но имеет достаточно приоритета, чтобы не быть убитым.

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

Так что если деятельность, которая находится в фоновом режиме и убита системой, onDestroy не гарантируется называться. И в этом случае onCreate будет вызываться после onStop без вызова onDestroy.

enter image description here

Вот почему в образе вопроса (деятельность жизненный цикл), показано, что onCreate будет называться после onStop если процесс App убит.

Edit 1:

Если вы хотите, чтобы справиться с чем угодно (например, освобождая память, убивая память ресурсоемких задач, и т.д.), прежде чем деятельность разрушается и так onDestroy не гарантируется называть, вы можете реализовать ComponentCallbacks2 (только для уровня api> = 14) для получения обратного вызова onTrimMemory с различными этапами вашего приложения/активности. Различают этапы и их объяснения: here.

Если вы хотите реализовать то же самое на уровне API < 14, вы можете использовать обратный вызов onLowMemory, который примерно эквивалентен TRIM_MEMORY_COMPLETE.

+0

Ваш ответ полезен. onDestroy() не гарантируется. Странно, что не существует метода onKilled(), поэтому невозможно обработать все события смерти. Теперь я изучаю, как использовать Сервис для решения моей проблемы. –

+0

@JeffreyChen, Да, есть способы получить эти обратные вызовы, я обновил свой ответ, просто просмотрите его. –

1

Это часто случается, когда я оставляю свое приложение в течение долгого времени, а затем обратно. Я думаю, это может быть связано с несколькими вызовами onCreate(). Как его решить?

В onCreate() вы можете проверить, работает ли фоновый поток, если да, то не запускайте его снова.

Что еще более важно, ваша фоновая нить a service или AsyncTask или просто простая Thread?

Учитывая формулировку в вашем вопросе, я бы порекомендовал вам перейти на service, если вы еще не используете его. Он не будет создавать проблему с несколькими потоками.

+0

handler.postDelayed ([Runneable с пробегом() содержит эту строку], SOME_PERIOD). Поэтому он периодически запускается до тех пор, пока флаг boolean не станет равным true. –

+0

Что делать, если я запускаю свою задачу в Сервисе, а затем Служба убивается и воссоздается. Похоже, что проблема «с несколькими потоками» тоже возникает. –

+0

@JeffreyChen Если служба запущена, она не будет запускаться снова.Если служба убита и ваша программа снова запустится, она все еще работает только с одним экземпляром этой службы. –

0

Пожалуйста, используйте Service для выполнения фоновой задачи. Если вы хотите остановить службу, когда текущая деятельность уничтожается, вы можете использовать Bind Service.

Пожалуйста, отправьте свой фрагмент кода, чтобы получить точную идею, как вы пытаетесь. мы можем помочь больше

Смежные вопросы