2013-05-29 3 views
2

У меня вопрос, который может выглядеть академическим, но на практике я столкнулся. Давайте добавим приложение, состоящее из двух действий A (root) и B.начало/остановка андроидной активности

A ->startActivity(A.this, B.class) ->B ->finish() ->A

Я добавил Войдите сообщение для onStart() и onStop() методов их. Когда я вернулся из B к A с помощью finish() я получаю:

05-29 18: 48: 03,559: D/MyLog (7075): А начинает

05-29 18: 48: 03.919: D/MyLog (7075): B останавливается

Как вы можете видеть, интервал между А начинается и B останавливается на 360 мс. Но этот интервал может быть сколь угодно большим. У меня есть приложение, где этот интервал составляет около 10 секунд. Поэтому у меня есть временной интервал, когда A активен, а B умирает, но все еще жив. Что произойдет, если (в интервале) я снова запустил B, используя startActivity(A.this, B.class)?

Моя реальная ситуация еще сложнее, потому что B является NativeActivity для игры OpenGL, и мое приложение просто падает с кодом C++, потому что игра не ожидает перезапуска перед ее завершением.

В любом случае, сначала я хотел бы знать, что Android-гуру думает о моем основном вопросе, а именно: что происходит, когда вы пытаетесь начать «умирающую» деятельность?

+0

Пожалуйста, не то, чтобы ваша деятельность не была убита. Он приостановлен (и может быть уничтожен, если Android нуждается в ресурсах). Поэтому запуск его снова приведет к вызову onResume на B – RvdK

+0

Самый простой способ узнать ... просто попробуйте. Изучение на практике всегда хорошо –

+0

Я ожидаю, что 'Activity B' будет снова создан, так как это было' finish() 'ed, но, возможно, это не так. Возможно, решение вашей проблемы - начать очистку ваших родных ресурсов в onStop(), так как это гарантировано будет вызвано, когда другое действие фокусируется на экране. – Karakuri

ответ

0

Невозможно «начать« умирающую »деятельность, как вы выразились.

Вызов startActivity(A.this, B.class) после finish() в B просто создает новый экземпляр деятельности В.

Также одна вещь, следует отметить, что onStop() никоим образом не указывает на то, активность умер или умирает. См. Ниже, что от onStop(), что onRestart() является одним из возможных следующего шага. Вы должны рассмотреть Android Lifecycle

Android Lifecycle

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

+0

Скорее всего, необходимо, чтобы часть собственной логики обработки была защищена от наличия нескольких экземпляров, которые могут быть в разных состояниях. –

+0

Ну, если жизненный цикл Android не позволяет использовать вашу логику в настоящее время так, как вы этого хотите, тогда вам придется реорганизовать код так, чтобы ваша логика обработки существовала либо полностью в жизненном цикле Activity, либо существовала без зависимость от Activity. Не зная своей логики, если она должна быть защищена от наличия нескольких экземпляров, тогда используйте шаблон проектирования Singleton для него или какой-то статический доступ. – triggs

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