2013-12-21 1 views
4

У меня есть приложение, в котором я программно создаю вид EditText. Я назначить идентификатор этой точки зрения, используя setId()Сохранение состояния объекта при нажатии пользователем кнопки «Назад»

myEditText.setId(100); 

так что Android автоматически сохраняет состояние этого объекта во время приостановки/остановки приложения (как мне посоветовали сделать here). Он работает в этих случаях:

  • (1) Когда я оставить приложение с помощью кнопки «Home»: если я потом вернуться в приложение, состояние объекта (отображается текст) восстанавливается, как и ожидалось ,
  • (2) При изменении ориентации экрана (в котором Android автоматически уничтожает активность и восстанавливает ее через Bundle). Состояние объекта также сохраняется.

Однако не работает в этом случае:

  • (3) Когда я оставить приложение с помощью кнопки «Назад»: если я потом вернуться в приложение, то EditText объект пуст.

Любое объяснение, почему это происходит? Отличает ли Android отличное отключение приложения с «Главная» и «Назад»? Согласно documentation, состояние объекта должно быть автоматически сохранено через Bundle, , даже когда действие уничтожается. И это явно происходит в случае (2). Но не в случае (3)!

Если это нормальное поведение, как я могу автоматически сохранить и восстановить состояние приложения, когда пользователь нажимает «Назад»? Я знаю, что я мог бы использовать SharedPreferences для этого, но я предпочел бы, чтобы Android делал это автоматически, как это происходит в случаях (1) и (2).

Это происходит, по крайней мере, в Android 4.0 и 4.2 (я еще не тестировал другие).

+0

Использовать общие настройки в хранилище и восстановить его. После того, как вы нажмете кнопку «Назад», текущая активность будет удалена из предыдущего стека и будет уничтожена. Предыдущее действие в стеке занимает фокус – Raghunandan

+0

@Raghunandan Спасибо, но, как я сказал в вопросе, я хотел бы сделать это без SharedPreferences. В идеале мне бы хотелось, чтобы такое же поведение, как и с кнопкой «Домой»: Android автоматически сохраняет и восстанавливает –

+0

метод onDestroy() также вызывается после метода onPause() и onStop(), когда вы перемещаетесь от приложения с помощью кнопки «Назад». Дополнительную информацию см. В жизненном цикле деятельности. –

ответ

1

Я думаю, что я нашел объяснение.Мне нужно было только внимательно прочитать документ (спасибо @lentz за одну из ссылок); см here и here:

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

Если пользователь нажимает кнопку «Назад», текущая активность выносится из стека и уничтожается. Предыдущее действие в стеке возобновляется. Когда действие уничтожается, система не сохраняет состояние активности.

Приведенное выше объясняет поведение (3) в моем вопросе.

Однако, если система разрушает активность из-за ограничений системы (а не нормальное поведение приложения), то хотя фактически экземпляр активности нет, система запоминает, что существует такое, что если пользователь переходит обратно к нему , система создает новый экземпляр активности, используя набор сохраненных данных, который описывает состояние активности при ее уничтожении. Сохраненные данные, которые система использует для восстановления предыдущего состояния, называются «состоянием экземпляра» и представляют собой набор пар ключ-значение, хранящихся в объекте Bundle.

Приведенное выше, вероятно, объясняет поведение (1) и (2).

То, что я не вижу, является Почему пользователь, нажав Назад, должен интерпретироваться как «действие больше не требуется» («его состояние не сохраняется»). Но это другое дело.

+0

Это то, что я искал. У меня была точно такая же проблема. Теперь я понимаю это, но я до сих пор не знаю, как это исправить. Вы тоже не упомянули об этом. Любые идеи @LuisMendo? – Sudhanshu

+0

@Sudhanshu Ну, как я вижу сейчас, нет ничего для _fix_. Android забывает о состоянии активности, когда пользователь нажимает «Назад», но не при нажатии «Главная». Кажется, что Android работает: «Домой» и «Назад» работают по-другому. Если вы хотите сохранить состояние на Назад нажмите, вы должны сделать это вручную с SharedPreferences, как указано в комментариях выше –

+0

спасибо за ответ! Думаю, у меня нет выбора :( – Sudhanshu

3

Вы действительно должны изучать жизненные циклы активности, так как существует множество способов решения проблемы. Поскольку ваша деятельность обычно удаляется из стека и уничтожается, когда вы переходите назад одним быстрым, но не обязательно лучшим способом, убедитесь, что ваша активность отмечена как singleTop или singleInstance в манифесте таким образом, что она не удалена из стека и не воссоздана когда вы перемещаетесь взад и вперед. Вы также можете использовать класс Singleton Application. Или передать текст туда и обратно в качестве параметров. Или используйте базу данных. Или используйте MVC или какую-то другую парадигму программирования, которая позволит вам уничтожать и воссоздавать ваши представления, не заполняя их данные. Много «или». Изучите жизненные циклы активности, а затем посмотрите, как у вас уже установлена ​​ваша архитектура архитектуры приложений, и выберите метод, который будет работать лучше всего для вас.

http://developer.android.com/training/basics/activity-lifecycle/index.html

http://developer.android.com/guide/components/tasks-and-back-stack.html

+1

+1 Спасибо. Однако мой вопрос был намного более узким: почему состояние представления _automatically_ сохраняется в домашней печати, но не в обратном прессе. Внимательно прочитав документ, он говорит точно, что: Home и Back действительно относятся по-разному. Так что это «нормальное» поведение, если «нормальным» мы понимаем «указано в документации» –

+0

Рад, что я мог бы помочь вам указать на правильное направление. – lentz

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