2015-03-19 2 views
1

Я столкнулся с неприятной проблемой, я не знаю, как правильно ее решить.Android предотвращает восстановление намерений после уничтожения на задней кнопке

Сценарий:

MainActivity имеет метод handleIncomingIntent()

Этот метод анализирует статисты, поступающий в поступающем намерении (для обслуживания, или широковещательного приемника) и открывает по уходу за детьми Мероприятия, основанный на намерению данных. Итак, когда входящий Intent имеет данные типа A, он запуститActivity (ActivityA.class), если из типа B тогда startActivity (ActivityB.class), если нет данных, он останется в MainActivity

Проблема в том, что устройство низкое в памяти, MainActivity будет уничтожен, а в ActivityA или ActivityB.

Поэтому, когда используется BackButton - MainActivity восстанавливается, и его входящий Intent восстанавливается в том же состоянии, что и перед его обработкой, несмотря на то, что я делаю inIntent.removeExtras (KEY) в конце моего метода handleIncomingIntent() , Таким образом, результат - это запуск Child Activity еще раз, и это цикл!

Я понимаю, что я могу хранить некоторый флаг isIntentConsumed в памяти внутри onDestroy(), а затем читать его restoreSavedState() и использовать его, чтобы отклонить намерение, поскольку оно уже потреблено.

Я просто чувствую, что должен быть лучший способ, чем «бандад», который я только что описал.

С наилучшими пожеланиями, Павел

ответ

0

Если остановленная активность разрушается из-за другие, чем нормальные условия ограничений системы (пользователь нажимает назад или сама деятельность отделка), метод onSaveInstanceState (Bundle savedInstanceState) будет называться. Когда пользователь переходит обратно к такого рода деятельности, onRestoreInstanceState (Bundle savedInstanceState) будет называться и предыдущий сохранен пакет будет передан в качестве параметра как onRestoreInstanceState() и OnCreate().

Таким образом, вы можете проверить фактический параметр OnCreate (Bundle savedInstanceState), если savedInstanceState != null вы можете знать, активность воссоздан. Надежда помогла.

+0

Спасибо Терри, я собираюсь попробовать его сегодня вечером и будет голосовать, если это работает. –

+0

Ничего себе, это было так просто. Я об этом не думал. Спасибо, Терри. Это правильный ответ –

+0

@PavelKirillov :) cheer, получайте удовольствие! –

0

что вы имеете в виду

Проблема заключается в том, когда устройство мало памяти, MainActivity разрушается, в ActivityA или ActivityB. не ясно, а также

Поэтому, когда Назад Кнопка используется

Я думаю, что вы говорите о кнопке назад пресс-конференции на активность А или В, если это так, то я хотел бы предложить вы должны завершить MainActivity после перехода на A или B. то при работе A/B вам следует пережить метод onBackPressed(), вы должны снова запустить основное действие и завершить активность A/B.

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

+0

Спасибо за ответ призрака, да. На реальном устройстве есть опция разработчика, называемая уничтожением неактивных действий. Когда выбрано, как только активность A/B полностью покрывает мою основную активность, ОС уничтожает последнее. Но, как вы уже догадались, когда я нажимаю кнопку «Назад» на A/B, Main воссоздается. Однако намерение, открывшее Main, восстанавливается в исходное состояние, как будто это первый раз. –

+0

Я не думаю, что это лучший образец, чтобы закончить Main и воссоздать его из A/B, потому что A/B может быть открыт другими вызывающими абонентами, такими как C или D ... Поэтому я в конечном итоге передаю вызывающего абонента ребенку и управляя всеми типами сценариев на Back Button, а не заканчивая A/B и получая, откуда он появился. Возможно, есть хороший способ помешать Android воссоздать намерение в неизмененном состоянии. Моя работа вокруг работает, мне просто нехорошо. Я добавил миллисекунды поколения к намерениям, и я сохраняю их в общих предпочтениях, чтобы позже увидеть, использовал ли я его или нет и игнорирую, если это необходимо. –

+0

Я думаю, что это своего рода проблема с алмазами :), но надеюсь, что вы скоро улучшите свое кодирование и получите удовлетворение –

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