Как сохранить состояние активности Android с помощью сохранения состояния экземпляра?

В некоторых случаях удобнее устанавливать точки останова только на некоторые из методов.

Используя LLDB, мы можем, например, поставить точку останова на все методы ViewDidLoad по имени.

(lldb) breakpoint set -n ViewDidLoad

Здесь «-n» означает по имени.

Кроме того, мы можем поместить контрольные точки по имени селектора:

(lldb) breakpoint set -S alignLeftEdges:

Здесь «-S "означает селектор.

2478
задан Manohar Reddy 29 May 2019 в 06:21
поделиться

9 ответов

Необходимо переопределить onSaveInstanceState(Bundle savedInstanceState) и записать значения состояния приложения, которые Вы хотите изменить на Bundle параметр как это:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("MyBoolean", true);
  savedInstanceState.putDouble("myDouble", 1.9);
  savedInstanceState.putInt("MyInt", 1);
  savedInstanceState.putString("MyString", "Welcome back to Android");
  // etc.
}

Пакет является по существу способом сохранить NVP ("Пара"имя-значение"") карта, и это будет передано в onCreate() и также onRestoreInstanceState(), где Вы тогда извлекли бы значения как это:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
  double myDouble = savedInstanceState.getDouble("myDouble");
  int myInt = savedInstanceState.getInt("MyInt");
  String myString = savedInstanceState.getString("MyString");
}

Вы обычно использовали бы эту технику для хранения значений экземпляра для приложения (выборы, несохраненный текст, и т.д.).

2458
ответ дан David Kariuki 29 May 2019 в 06:21
поделиться
  • 1
    Я думал о чем-то как этот. Могло бы быть следующее лучшее решение использования enum тип с точки зрения простоты записи. – FK82 27 September 2010 в 08:21

Эти savedInstanceState только для сохранения состояния, связанного с текущим экземпляром Действия, например, текущая информация о навигации или выборе, так, чтобы, если Android уничтожает и воссоздает Действие, это могло возвратиться, как это было прежде. См. документацию для onCreate и onSaveInstanceState

Для большего количества долговечного состояния, рассмотрите использование базы данных SQLite, файла или предпочтений. См. Сохранять Постоянное состояние .

411
ответ дан Benoit Duffez 29 May 2019 в 06:21
поделиться

можно использовать Live Data и View Model Для Lifecycle Handel От JetPack. посмотрите эту Ссылку:

https://developer.android.com/topic/libraries/architecture/livedata

0
ответ дан 22 November 2019 в 19:51
поделиться

Вместо этого необходимо использовать ViewModel, который сохранит данные до жизненного цикла действия.

0
ответ дан 22 November 2019 в 19:51
поделиться

Существует способ заставить Android сохранить состояния, не реализовывая метода. Просто добавьте эту строку к своей Декларации в объявлении Действия:

android:configChanges="orientation|screenSize"

Это должно быть похожим на это:

<activity
    android:name=".activities.MyActivity"
    android:configChanges="orientation|screenSize">
</activity>

Здесь можно найти больше информации об этом свойстве.

рекомендуется позволить Android обработать это для Вас, чем ручная обработка.

1
ответ дан 22 November 2019 в 19:51
поделиться

onSaveInstanceState вызывается, когда системе нужна память и она убивает приложение. Он не вызывается, когда пользователь просто закрывает приложение. Поэтому я думаю, что состояние приложения также должно быть сохранено в onPause Оно должно быть сохранено в каком-то постоянном хранилище, таком как Preferences или Sqlite

80
ответ дан 22 November 2019 в 19:51
поделиться

На самом деле onSaveInstance состояние вызывается, когда Activity переходит в фоновый режим

Цитата из документации : «метод onSaveInstanceState (Bundle) вызывается перед переводом действия в такое фоновое состояние»

39
ответ дан 22 November 2019 в 19:51
поделиться

Обратите внимание, что НЕ безопасно использовать onSaveInstanceState и onRestoreInstanceState для постоянных данных, согласно документации по состояниям активности в http://developer.android.com/reference/android/app/Activity.html.

В документе говорится (в разделе «Жизненный цикл действия»):

Обратите внимание, что важно сохранить постоянные данные в onPause() onSaveInstanceState(Bundle) Поскольку последний не является частью обратные вызовы жизненного цикла, поэтому не будут вызывается в каждой описанной ситуации в его документации.

Другими словами, поместите код сохранения/восстановления для постоянных данных в onPause() и onResume()!

EDIT: Для дальнейшего уточнения вот документация onSaveInstanceState():

Этот метод вызывается до того, как действие может быть убито, чтобы при его удалении возвращается когда-нибудь в будущем, он сможет восстановить свое состояние. Для Например, если действие B запускается перед действием A и в некоторых Действие точки A убито для возвращения ресурсов, действие A будет иметь возможность сохранить текущее состояние своего пользовательского интерфейса через этот , чтобы при возврате пользователя к действию A, состояние пользовательский интерфейс может быть восстановлен через onCreate(Bundle) или onRestoreInstanceState(Bundle).

403
ответ дан 22 November 2019 в 19:51
поделиться

Мой коллега написал статью, объясняющую состояние приложения на устройствах Android, включая пояснения по жизненному циклу активности и информации о состоянии, как хранить информацию о состоянии и сохранять в состояние Bundle и SharedPreferences и посмотрите здесь.

В статье рассматриваются три подхода:

Хранение данных управления локальной переменной/пользовательского интерфейса на протяжении всего жизненного цикла приложения (т. е. временно) с использованием пакета состояния экземпляра.

[Code sample – Store state in state bundle]
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
  // Store UI state to the savedInstanceState.
  // This bundle will be passed to onCreate on next call.  EditText txtName = (EditText)findViewById(R.id.txtName);
  String strName = txtName.getText().toString();

  EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
  String strEmail = txtEmail.getText().toString();

  CheckBox chkTandC = (CheckBox)findViewById(R.id.chkTandC);
  boolean blnTandC = chkTandC.isChecked();

  savedInstanceState.putString(“Name”, strName);
  savedInstanceState.putString(“Email”, strEmail);
  savedInstanceState.putBoolean(“TandC”, blnTandC);

  super.onSaveInstanceState(savedInstanceState);
}

Сохранение данных управления локальной переменной/пользовательского интерфейса между экземплярами приложения (т. предпочтения

[Code sample – store state in SharedPreferences]
@Override
protected void onPause()
{
  super.onPause();

  // Store values between instances here
  SharedPreferences preferences = getPreferences(MODE_PRIVATE);
  SharedPreferences.Editor editor = preferences.edit();  // Put the values from the UI
  EditText txtName = (EditText)findViewById(R.id.txtName);
  String strName = txtName.getText().toString();

  EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
  String strEmail = txtEmail.getText().toString();

  CheckBox chkTandC = (CheckBox)findViewById(R.id.chkTandC);
  boolean blnTandC = chkTandC.isChecked();

  editor.putString(“Name”, strName); // value to store
  editor.putString(“Email”, strEmail); // value to store
  editor.putBoolean(“TandC”, blnTandC); // value to store
  // Commit to storage
  editor.commit();
}

Сохранение экземпляров объекта в памяти между действиями в течение жизненного цикла приложения с использованием сохраненного экземпляра без конфигурации

[Code sample – store object instance]
private cMyClassType moInstanceOfAClass; // Store the instance of an object
@Override
public Object onRetainNonConfigurationInstance()
{
  if (moInstanceOfAClass != null) // Check that the object exists
      return(moInstanceOfAClass);
  return super.onRetainNonConfigurationInstance();
}
197
ответ дан 22 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: