Сохранение и загрузка activity
Есть два разных activity, условно это home и catalog. Начальной активностью при старте приложения является home. Она подтягивает json строку с параметрами от удаленного сервера, и на его основе генерирует несколько View(изображение и заголовок), а-ля список новостей.
Activity catalog выполняет аналогичный процесс, но с другими данными(и визуально разметка немного отличается).
Вопрос в том, можно ли как то сохранить уже созданные View на activity? Т.е условно я меняю activity через intent, и при возврате обратно хочу загрузить уже "отрисованную" страницу, а не генерировать ее заново. Вариант с сохранением jsona через putExtra уже рассматривал, интересует именно возможность сохранить View, созданные программно
Ответы (1 шт):
Значит логика работы следующая:
Возьмем две активности A и B , и посмотрим на жизненный цикл активностей при переходе из A в B.
Создали A
ActivityA: onCreate()
ActivityA: onStart()
ActivityA: onResume()
Переходим в B
ActivityA: onPause()
ActivityB: onCreate()
ActivityB: onStart()
ActivityB: onResume()
ActivityA: onStop()
Мы видим,что активность A не уничтожилась.
Нажимаем кнопку back( переходи из B в A):
ActivityB: onPause()
ActivityA: onRestart()
ActivityA: onStart()
ActivityA: onResume()
ActivityB: onStop()
ActivityB: onDestroy()
И мы видим что активность A "восстановилась" - миновался вызов onCreate, сразу в onStart. Тем самым можно сделать вывод,что активность не уничтожиться,а данные сохраняться.И спокойно отобразятся.
Но при переходе в Активность B,у активности A может спокойно вызваться метод onDestroy(например система андроид освободила память), и когда мы перейдем обратно на активность A, то жизненный цикл начентся с onCreate и все данные потеряются. Как быть - чтобы этого не произошло? Для этого мы должны сохранять данные в методе onSaveInstanceState и получать сохраненный данные в onRestoreInstanceState или в onCreate(во многих кейсах так). Но разметка(views) перерисуются в любом случае.
приведу пример кода где данные восстанавливаются в onCreate :
public class MainActivity extends AppCompatActivity {
private static final String VALUE_KEY = "Value";
private int mValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
mValue = savedInstanceState.getInt(VALUE_KEY);
} else {
mValue = 1;
}
Toast.makeText(this, "Value: " + mValue, Toast.LENGTH_SHORT).show();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mValue = 2;
outState.putInt(VALUE_KEY, mValue);
}
}
Метод onSaveInstanceState(...) вызывается между onPause() и onStop().
Метод onRestoreInstanceState(...) вызывается после onStart().