startNewActivity много раз не хватает понимания жизненного цикла - PullRequest
1 голос
/ 14 октября 2011

в действии A

while(i<5){
startActivity(new Intent(this, ActivityB.class));
Log.v(tag,"activity A");
}

в действии B внутри создания

Log.v(tag,"activity B");
finish();

и затем в консоли я вижу что-то подобное

activity A
activity A
activity A
activity A
activity A
activity B
activity B
activity B
activity B
activity B

Что я должен изменить, чтобы иметь ситуацию, когда результат будет выглядеть следующим образом

activity A
activity B
activity A
activity B
activity A
activity B

Я имею в виду, что для каждого метода startActivity я хочу, чтобы новая операция действительно запускалась.Потому что действие B фактически живет в течение доли секунды, когда оно начато, а затем закончено.Моя проблема в понимании жизненного цикла деятельности.Я ожидал, что когда я вызову srartActivity, действие действительно начнется, но этого не происходит.

Edit1: хорошо, я вставил небольшой фрагмент своего кода.и проблема не в цикле while, в моем реальном проекте правильно написано с инициализацией переменной i наподобие int i-0;и увеличение внутри цикла, как i ++;,,,Как вы видите, вывод из приложения хорош, все вызывается по-серциански несколько раз и так далее, но проблема заключается в порядке вызова.это похоже на то, что startActivity не запускает действие после вызова srartActivity, вместо этого каждая вещь запускается после завершения создания actionA.

1 Ответ

3 голосов
/ 14 октября 2011

Речь идет не только о жизненном цикле активности, но и об обработке сообщений в основном потоке (= поток пользовательского интерфейса) вашего приложения.startActivity возвращается сразу после отправки намерения, поэтому цикл while запускает 5 намерений запустить действие B в течение очень короткого времени, прежде чем вернуть управление в цикл сообщений потока.Только после возврата из текущего вызова метода основной поток ваших приложений может начать обработку ранее сгенерированных сообщений, что приведет к созданию 5 экземпляров Acitvity 5, еще раз один за другим.

Если вы хотите действие Aчтобы удержать до завершения действия B, вы можете вызвать startActivityForResult - один раз!Затем в Деятельности B вызовите finish (int) для возврата результата в Деятельность A. Переопределите onActivityResult в Деятельности A, чтобы получить код результата, и отсюда вы можете снова запустить Acitity B, если необходимо.

См. Также Начало деятельности и получение результатов

...