Android предотвращает восстановление намерения после уничтожения на кнопке «Назад»

У меня возникла неприятная проблема, которую я не знаю, как правильно решить.

Сценарий:

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

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

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

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

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

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

С уважением, Павел


person Pavel Kirillov    schedule 19.03.2015    source источник


Ответы (2)


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

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

person Terry Liu    schedule 20.03.2015
comment
Спасибо, Терри, я попробую сегодня вечером и проголосую, если это сработает. - person Pavel Kirillov; 20.03.2015
comment
Вау, это было так просто. Я не думал об этом. Спасибо, Терри. Это правильный ответ - person Pavel Kirillov; 24.03.2015
comment
@PavelKirillov :) веселись, веселись! - person Terry Liu; 24.03.2015

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

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

Поэтому при использовании кнопки «Назад»

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

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

person ghost talker    schedule 20.03.2015
comment
Спасибо за ответ, призрак, да. На реальном устройстве есть опция разработчика, называемая уничтожением неактивных действий. При выборе, как только активность A/B полностью покрывает мою основную активность, ОС уничтожает последнюю. Но, как вы правильно догадались, когда я нажимаю кнопку «Назад» на A/B, Main воссоздается. Однако Intent, открывший Main, восстанавливается в исходное состояние, как будто это было впервые. - person Pavel Kirillov; 20.03.2015
comment
Я не думаю, что лучше закончить Main и воссоздать его из A/B, потому что A/B могут быть открыты другими вызывающими объектами, такими как C или D... Так что я в конечном итоге передам вызывающий объект дочернему и управляю все виды сценариев на кнопке «Назад» вместо того, чтобы закончить A / B и получить то, что пришло. Возможно, есть хороший способ запретить Android воссоздавать Intent в неизменном состоянии. Моя работа вокруг работает, просто мне это кажется неправильным. Я добавил временную метку генерации в миллисекундах к намерению и сохранил ее в общих настройках, чтобы позже увидеть, использовал я ее или нет, и проигнорировать, если это необходимо. - person Pavel Kirillov; 20.03.2015
comment
Я думаю, что это своего рода проблема Diamond :), но надеюсь, что вы скоро улучшите свой код и получите удовлетворение. - person ghost talker; 20.03.2015