Intereting Posts
Android: как обнаружить, когда свиток закончился Webscraping с помощью Phonegap Обнаружение прокрутки вверх и прокрутка вниз в ListView Два пользовательских интерфейса панели с фрагментами и отдельными действиями Не удается выполнить OnItemClick для GridView в PopupWindow Google Play Game Services разблокирует достижение – хранить разблокировку в игре или разблокировать вызов () каждый раз? Как удалить нераспознанные символы, которые возвращаются из веб-службы? Mkdirs aways возвращает false в Android 5.1 Apache Cordova для Android не загружает ресурсы Java.lang.RuntimeException: WakeLock не заблокирован C2DM_LIB Android EditText / TextView, как заставить каждое слово начинаться с верхнего регистра, а все остальные символы слов – строчными буквами Как отображать статическую карту google на андроиде? Пропущенные рамки. Приложение может делать слишком много работы по его основному потоку »ошибка в android 4.3 nexus 7 Невозможно выключить экран во время воспроизведения видео. Android: Можно ли автоматически подключаться к устройству Bluetooth LE, когда оно входит в диапазон, и начинает рекламу?

Как работать с сохраненными данными после того, как «Активность» выходит на передний план при использовании нескольких операций?

На данный момент я немного запутался в управлении жизненным циклом в Android. Есть как минимум 4 возможности возобновить сохраненные данные после того, как Activity вернется на передний план:

Хотя это путает, какой подход лучше всего, я полагаю, он полагается на опыт развития, чтобы знать, когда использовать эту возможность. Если у вас есть хорошие примеры для каждого, я буду рад, но это не мой вопрос. Интересно, как справиться со всем этим, когда у меня разные действия, и одна активность будет убита Android, когда она остановится в фоновом режиме:

В моем случае у меня есть MainActivity и MessageActivity. MessageActivity состоит из ViewSwitcher, который состоит из двух состояний. State one – это список выбора переключателей. State two – EditText с двумя кнопками (send and abort). Когда я обезьяна проверяю каждое состояние, нажимаем кнопку «Главная страница Android» и перезапускаем приложение, правая часть с правильным состоянием и старыми данными выходит на передний план, когда я оставляю обработку на Android. Так что работает.
Но что происходит, когда Android уничтожает MessageActivity в фоновом режиме: если я использую способ Android, данные теряются, и я полагаю, что MainActivity (вместо состояния MessageActivity-> (1 или 2)) начнется в следующий раз после того, как я перезапущу приложение ( Что правильно?). Поэтому, когда я хочу сохранить данные MessageActivity, я должен использовать одну из трех других возможностей.
Как это сделать аккуратно, когда точка входа приложения (так что MainActivity) отличается от последней активной активности. Проблема в том, что мне нужно возобновить специальное мероприятие со специальным состоянием ViewSwitcher. Я мог бы запустить MessageActivity из MainActivity с помощью метода startActivity (Intent) в onStart () или onResume () (поскольку MainActivity, вероятно, является точкой входа), но затем я сталкиваюсь с множеством логических проблем в управлении жизненным циклом. Из-за этого я не думаю, что это правильный способ сделать это.

Но каков правильный и лучший способ сделать это?

Я предполагаю, что MainActivity (вместо состояния MessageActivity-> (1 или 2)) начнется в следующий раз после перезапуска приложения (это правильно?)

Нет, я не верю, что это правильно, в зависимости от того, что делает ваш код в onCreate (). Это, конечно, не обязательно должно быть правильным, если вы пойдете по правильному пути. Простой способ проверить это – повернуть экран, который воссоздает выполняемые действия, если только вы не переопределили поведение изменения конфигурации по умолчанию.

Я рекомендую внимательно прочитать этот раздел в документах Android:

http://developer.android.com/guide/topics/fundamentals/activities.html#SavingActivityState

В частности:

Даже если вы ничего не делаете и не реализуете onSaveInstanceState (), часть состояния активности восстанавливается по умолчанию по умолчанию для класса onSaveInstanceState (). В частности, реализация по умолчанию вызывает onSaveInstanceState () для каждого представления в макете, что позволяет каждому представлению предоставлять информацию о себе, которая должна быть сохранена. Почти каждый виджет в платформе Android реализует этот метод по мере необходимости, так что любые видимые изменения в пользовательском интерфейсе автоматически сохраняются и восстанавливаются при воссоздании вашей активности. Например, виджет EditText сохраняет любой текст, введенный пользователем, и виджет CheckBox сохраняет, проверен ли он или нет. Единственная требуемая вами работа – предоставить уникальный идентификатор (с атрибутом android: id) для каждого виджета, который вы хотите сохранить в своем состоянии. Если у виджета нет идентификатора, он не может сохранить его состояние.

Это означает, что до тех пор, пока вы не будете форсировать какое-либо состояние пользовательского интерфейса при любых onCreate() , ваш стек активности и состояние пользовательского интерфейса будут восстановлены.

Лично мой предпочтительный подход заключается в том, чтобы сохранить как можно меньше состояний в переменных-членах моих действий, сохраняя и восстанавливая его с помощью onSave/RestoreInstanceState() и полагаясь на реализации по умолчанию, чтобы сохранить остальную часть состояния пользовательского интерфейса (содержимое текстового поля, и т.д). Данные, которые должны сохраняться между сеансами, я передаю непосредственно своей БД или настройкам, как только они будут изменены (например, в обработчике на клике). Это означает, что мне не нужно беспокоиться о жизненном цикле деятельности для этого. Насколько это возможно, мой пользовательский интерфейс просто представляет представление данных в моей БД (используя CursorAdapter и т. Д.).

Редактировать:

Что касается восстановления всего стека деятельности:

Когда пользователь оставляет задачу, нажав клавишу HOME, … Система сохраняет состояние каждого действия в задаче. Если пользователь позже возобновляет задачу, выбирая значок запуска, который начал задачу, задача выходит на передний план и возобновляет действие в верхней части стека.

(См. http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html )

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

Сначала я предлагаю не полагаться на «способ Android» – это приведет к непоследовательному поведению приложения в зависимости от свободной памяти устройства – плохой практике.

Мое предложение состоит в том, чтобы сохранять зависящие от состояния данные в парах ключ-значение в SharedPreferences , каждый раз, когда вы onPause() в onPause() в MessageActivity . Храните флаг в SharedPreferences , который указывает, какая была SharedPreferences , которая была последней открыта (если у вас есть только две SharedPreferences , вы можете легко перейти к флагам 0/1 или true / false). При повторном запуске приложения нормально запускать Activity, отмеченную в вашем AndroidManifest.xml, как «точку входа». Поэтому, естественно, вы проверите флаг в onResume() в своей MainActivity и запустите другое действие, если это необходимо. В MessageActivity's onResume() проверьте значения в SharedPreferences и заполните то, что необходимо … Если ваше приложение «возобновлено» до последнего действия в ActivityStack, это вызовет onResume() в последнем onResume() в ActivityStack .

То, как я занимался такой проблемой в прошлом, заключается в том, что служба работает в фоновом режиме, которая обрабатывает поток информации из разных видов деятельности с помощью намерений и слушателей (предпочтительнее, поскольку они являются наиболее легко развязанным решением) Или если вы очень осторожны, и по какой-то причине единственным жизнеспособным решением является хранение данных путем прямого доступа к свойствам или вызовов методов, вы можете также использовать статические свойства / методы в классе службы. Тем не менее, я настоятельно рекомендую использовать метод Intent / listener, поскольку он, как правило, более гибкий, потокобезопасный и развязанный. Кроме того, разумно убедиться, что в какой-то момент времени не так много (другими словами, используйте эту услугу для обработки Intent), когда это не требуется, в противном случае служба будет стремиться зацикливать процессорное время, а также оперативную память, Когда это действительно не нужно.

Некоторые ресурсы, на которые нужно обратить внимание, когда речь заходит о таком подходе, будут IntentService и связанные с ним классы, включая суперкласс, Service. Однако IntentService стоит обратить внимание на еще несколько вещей об обработке async Intent и т. Д., С которой Служба автоматически не приходит.

Надеюсь, это поможет вам!

 login.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String name=username.getText().toString(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); SharedPreferences.Editor editor = settings.edit(); editor.putString("username", name); if(name.equals("xxx")) { Intent intent=new Intent(currentactivity.this,nextactivity.class); intent.putExtras(bundle); startActivityForResult(intent,0); } } });