Завершить действие ПОСЛЕ (задержка) начала нового

Не уверен, как это сделать:

Current activity is: A

I want to start activity: B

Но я хочу, чтобы пользовательский интерфейс действия B полностью загружался до завершения действия A.

Что мне нужно:

Current activity is: A

Start new activity: B

Activity B loads completely

Activity A finishes

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

Заранее спасибо.


person Athena    schedule 21.08.2014    source источник
comment
Возможно, вы захотите изучить ресурсы анимации и overridePendingTransaction(). Пусть Activity подождет, прежде чем она выскользнет. Не уверен, что это сработает, но может. Если нет, вы можете вместо этого реализовать действие B как фрагмент и вставить его в оверлей RelativeLayout.   -  person zgc7009    schedule 21.08.2014
comment
Вы можете попробовать обернуть Activity#finish() методом Handler#postDelayed(). Любопытно, почему вы хотите закрыть Activity A вручную?   -  person Leandro    schedule 21.08.2014
comment
@zgc7009 zgc7009 Я пробовал overridePendingTransition, но анимация выхода только задерживает начало новой активности. Он не допускает перекрытия. Фрагмент кажется единственным другим решением. Но это означало бы преобразование всей моей деятельности во фрагменты — я пытаюсь этого избежать.   -  person Athena    schedule 21.08.2014
comment
@Leandro Правильно ли используется Handler#postDelayed() после того, как действие находится в состоянии паузы? Оба действия A и B являются непересекающимися действиями, доступными только через панель навигации. Нажатие назад в действии B не должно переводить пользователя в действие A — таким образом, вызов finish().   -  person Athena    schedule 21.08.2014
comment
Вы можете отправить широковещательную рассылку от B к A, которая запускается в onStart() B, и когда A ее получает, A завершается.   -  person zgc7009    schedule 21.08.2014
comment
@zgc7009 zgc7009 Из того, что я узнал, broadcastreceivers должен быть зарегистрирован в onResume() и не зарегистрирован в onPause(). Как действие A будет получать широковещательную рассылку, поскольку она уже прошла onPause()?   -  person Athena    schedule 21.08.2014
comment
@Athena Мое решение, даже если оно работает, кажется неправильным. Но я спросил мотивировку вашего намерения понять вашу потребность и предложить что-то более адекватное. Если я правильно понял, их не нужно закрывать Activity A, просто не возвращайтесь к ним, если нажата кнопка назад. Если вы открыли Activity B только для одного действия, вы можете сделать Activity#startActivityForResult(), сделать то, что вам нужно, в Activity B и переопределить Activity#onActivityResult() в Activity A, чтобы закрыть его.   -  person Leandro    schedule 21.08.2014
comment
@Leandro Леандро Я не думаю, что startActivityForResult сработает в моем случае. Каждое действие в навигационном ящике (всего 7) является независимым по функциональности. Таким образом, всякий раз, когда любой из них запускается, они должны оставаться в корне задачи. Например, когда запускается B, B должен быть корневым. То же самое касается любой другой деятельности.   -  person Athena    schedule 21.08.2014
comment
Мужик, даже не подумал об этом. Я пытаюсь придумать растянутую идею, чтобы вам не приходилось использовать фрагменты, но я действительно думаю, что это приведет к желаемому результату. Возможно, вы сможете создать какой-то глобальный счетчик стека, который увеличивается каждый раз, когда вы запускаете действие и из своей корневой активности, а затем отступаете и нажимаете onResume() для завершения действий в стеке и уменьшает глобальный счетчик стека, пока он не вернется к 0 (ваша корневая активность).   -  person zgc7009    schedule 21.08.2014
comment
@ zgc7009 Я очень ценю вашу помощь :). Переключение на фрагменты может быть единственным разумным решением. Спасибо.   -  person Athena    schedule 21.08.2014


Ответы (1)


Вот один не очень прямолинейный подход в верхней части моей головы. Вы можете использовать что-то под названием LocalBroadcast Manager. Это было бы похоже на сообщение от Activity B к Activity A, говорящее: «Эй, я закончил загрузку анимации. Теперь ты мне не нужен!».

Таким образом, перед началом новой активности ваша активность A может начать слушать эту локальную трансляцию и зарегистрировать приемник. Затем, когда в вашем действии B анимация заканчивается, вы можете отправить сообщение Local Broadcast, в котором говорится: «Ты мне не нужен» (не буквально). Это будет получено получателем в действии A, где вы можете его закончить.

См. раздел как использовать LocalBroadcastManager?, чтобы узнать, как легко его реализовать. Надеюсь, это поможет вам.

person Shobhit Puri    schedule 21.08.2014
comment
Из того, что я узнал, broadcastreceivers должен быть зарегистрирован в onResume() и незарегистрирован в onPause(). Разве это не так? - person Athena; 21.08.2014
comment
Верно в общем. Они говорят, что onPause всегда будет вызываться. onDestroy() может не вызываться только в том случае, когда приложение/активность уничтожается системой для освобождения памяти. Даже тогда это не должно быть проблемой в вашем случае, так как тогда в любом случае не будет никакой активности. Для Local Broadcast вы можете отменить регистрацию сразу после того, как получите сообщение от Activity B. Поскольку вы обязательно вызовете его после завершения анимации, это не должно создавать проблемы. На мой взгляд, вызов unregister n onPause в этом случае не нужен. - person Shobhit Puri; 21.08.2014
comment
В порядке. Я попробую и вернусь к вам. - person Athena; 21.08.2014
comment
Кажется, работает нормально .. в ожидании дальнейших тестов на разных устройствах / API. Спасибо чувак. - person Athena; 21.08.2014
comment
Конечно. Пожалуйста, прокомментируйте, если вы обнаружите какие-либо проблемы с этим. Мне тоже поможет :) - person Shobhit Puri; 21.08.2014
comment
Да, увидел этот ответ после того, как опубликовал свой комментарий, подумал об этом больше и согласился. Вы отправляете свою трансляцию так скоро после приостановки активности, что вероятность того, что вы столкнетесь с утечкой, крайне мала. Я бы отменил регистрацию приемника, прежде чем вы завершите свою деятельность. - person zgc7009; 21.08.2014