2016-11-20 2 views
3

Я исследовал многочисленные сообщения об активности back stacks, а также веб-сайт разработчика Android, но до сих пор не могу найти решение проблемы, с которой я сталкиваюсь.Активность Android Back Stack Проблема с навигацией

Сценарий:

У меня есть Activity A, я перейти к Actvity B, от A, а затем нажмите кнопку назад, чтобы снова перейти к Activity A:

Actvity A ->Activity B ->Actvity A

Ничего необычного ..

Проблема

Когда я нажимаю кнопку назад, чтобы перейти к от Activity B ->Activity A, Activity B не разрушается сразу, как и следовало ожидать, что переходит в состояние паузы, и это то, где у меня есть странная проблема. Если я хочу, чтобы вернуться к Activity B из Activity A и IFActivity B все еще находится в состоянии паузы все его методы жизненного цикла называются при использовании startActivity(B) из Activity A:

Activity B - onCreate()> >onStop>onDestroy < - почему это происходит

На данный момент для меня он больше не должен существовать, и я не могу объяснить, почему он прошел все его методы жизненного цикла, а не только методы жизненного цикла инициализации. Выпадение из этого странного поведения состоит в том, что активность все еще видна на экране, но не заполняет RecyclerView, который в первой инициализации сделал так, как ожидалось. В этот момент, если я вернусь, Activity B снова войдет в состояние паузы.

Если Activity B находится в состоянии паузы (Activity A находится на вершине стека) и структура заканчивается Activity B через жизненного цикла обратных вызовов, и я снова перейти к Activity B от А он работает, как ожидалось (RecyclerView заселен), в основном свежий экземпляр всегда работает отлично.

Все, что я могу предположить, когда речь идет о диаграмме активности Lifecycle, что Activity B входит в состояние паузы, однако разрушается, не вызывая onStop, onDestroy и т.д .. означает любую активность операции очистки у меня есть в этих обратных вызовов не происходит?

Вещей я Пробовал

Изменения различных Intent фильтров и их комбинации, при запуске Activity B:

FLAG_ACTIVITY_NEW_TASK 

FLAG_ACTIVITY_CLEAR_TOP 

FLAG_ACTIVITY_SINGLE_TOP 

Вызова finish() когда onBackPressed() вызывается в Activity B

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

Помогите пожалуйста!

+0

удалить 'super.onBackPressed()' from' onBackPressed() 'in ** Activity A ** ниже - это код для' onBackPressed() '' @Override public void onBackPressed() {moveTaskToBack (true); } ' –

+0

@jatDevta Я не уверен, как это изменит что-либо, Activity A, не проблема. Во-вторых, у меня есть рисование навигации в Activity A, добавив этот метод moveTaskToBack (true); 'toBackPressed()' просто закроет приложение, вместо того, чтобы закрывать ящик навигации, если он будет открыт, а я нажму? –

ответ

0

Итак, я нашел ответ на проблему - сначала не очевидно, но теперь я понимаю, что происходит.

Основная причина проблемы состояла в том, чтобы сделать 2 экземпляра одной и той же Деятельности (Activity B), ссылаясь на те же объекты (объекты, предоставленные из библиотеки DI).

Во-первых, при возвращении в Activity A из Activity B, Activity B не сразу уничтожены, и это вызывает осложнение - этот экземпляр не будет использоваться повторно, однако до сих пор существует в течение нескольких секунд. В этой ситуации при использовании startActivity (B) от Activity A он создаст новый экземпляр и уничтожит старый (следовательно, почему я видел ведение журнала как для обратных вызовов создания, так и для действия), если он все еще существует. В этом случае оба экземпляра использовали один и тот же объект, и этот объект «очищал» действие при его уничтожении. Таким образом, объекту (Presenter в этом случае) рассказывал старый экземпляр о том, что он должен очистить Activity как его уничтожение, однако это было не так, потому что был создан новый экземпляр.

Раствор

Довольно просто на самом деле, каждый раз, когда был создан новый экземпляр Activity B, хранить в Presenter уникальный номер (startId), и когда Activity B называется onDestroy() передать свой текущий уникальный номер, и проверка они совпадают - если они не соответствуют его не последнему экземпляру, так что ничего не делать. Очень похожая идея, когда вы хотите остановить службу, и проверьте ее последнюю активность, вызвав службу из startId.

Лично я не знаю, почему действия не уничтожаются сразу после отжима, но это причина, почему это происходит.