Можно ли воссоздать активность и сохранить экземпляр среды выполнения?

Я создаю SettingsActivity, чтобы пользователи могли устанавливать предпочтения. Одним из предпочтений является цвет кожи.

    Intent settingIntent = new Intent(this, SettingsActivity.class);
    startActivity(settingIntent);

Как только пользователь закончит настройку, он нажмет кнопку «Готово», чтобы вернуться к MainActivity.

    Intent intent = new Intent();
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    intent.setClass(this, MainActivity.class);
    startActivity(intent);
    finish();

Но MainActivity на самом деле не меняется.

Я понимаю, что применяю изменения только в onCreate()

    setTheme(SettingsActivity.getSkinColor()); // Get the preference from SharedPreference
    setContentView(R.layout.mylayout);

В этом случае я думаю, что мне нужно воссоздать активность. Поэтому я меняю intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) на intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK).

Однако он создаст новую MainActivity, когда пользователь нажмет кнопку «Готово».

Есть ли способ применить setTheme без воссоздания активности? Или, по крайней мере, сохранить все экземпляры времени выполнения и состояние, когда я создаю новый?


person Dragon warrior    schedule 20.02.2013    source источник


Ответы (2)


Добавьте Extras к намерению дать только что запущенному Activity состояние времени выполнения и информацию о теме, необходимую для правильной настройки.

person Dale Wilson    schedule 20.02.2013
comment
Если я все еще хочу использовать намерение.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) для восстановления активности в стеке. Есть ли способ передать данные с помощью намерения.putExtra(). Или есть способ установить обратный вызов, когда я отклоняю действие настройки. - person Dragon warrior; 21.02.2013

Вам не нужно принудительно воссоздавать свою деятельность.

В onResume() вашей основной деятельности вы можете проверить, была ли изменена тема. Если это так, просто вызовите setTheme(), а затем снова setContentView(), и это воссоздаст ваш макет с новой темой. Не забудьте повторить все ваши findViewById() вызовы, потому что все ваши View объекты были воссозданы.

person David Wasser    schedule 20.02.2013
comment
Предполагая, что я вызываю setTheme(android.R.style.Theme_Light). Как я могу проверить, изменена ли тема на другой resId? - person Dragon warrior; 21.02.2013
comment
Вы можете вызвать getTheme() в onCreate() и запомнить это в переменной-члене. В onResume() снова вызовите getTheme() и сравните. - person David Wasser; 21.02.2013