2013-10-12 4 views
1

Я работаю над приложением Android, где я хочу сохранить информацию, введенную в текстовое представление активности в базе данных всякий раз, когда поступает телефонный звонок, меняется ориентация приложения и т. Д.onSaveInstanceState вызывается дважды в Orientation Change

Я использую этот код для сохранения информации, введенной пользователем в текстовое представление.

@Override 
protected void onSaveInstanceState(Bundle outState) { 
     save(); 
     Toast.makeText(getApplicationContext(), "On save state", Toast.LENGTH_SHORT).show(); 
    super.onSaveInstanceState(outState); 
} 

Проблема:

Всякий раз, когда мой телефон ориентация изменяется метод onSaveInstanceState вызывается дважды. Может ли кто-нибудь объяснить мне причину этого.

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

Я не могу использовать android:configChanges="orientation|screenSize" в файле манифеста, чтобы иметь дело с изменением ориентации. Поскольку реклама исчезает, когда пользователь меняет пейзаж на портрет.

onSaveInstanceState вызывается только один раз, когда телефонный звонок получен :)

Примечание: сохранить() также называется onBackPressed метод()

Пожалуйста помогите!

+0

is save() только вызываемый в методе onSaveInstanceState()? – dumazy

+0

Нет, он также называется методом onBackPressed() –

+0

Я просто хочу убедиться, что все данные сохраняются в базе данных, когда когда-либо действие происходит в фоновом режиме, уничтожается или любое другое перехват –

ответ

1

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

onSaveInstanceState Используется для сохранения временного состояния деятельности, чтобы иметь возможность воссоздать его точно так же, как на onCreate или onRestoreInstanceState. Реализация по умолчанию уже сохраняет/восстанавливает большинство стандартных представлений пользовательского интерфейса, и если вы переопределяете его, возможно, вам захочется продолжить реализацию по умолчанию, а затем сохранить/восстановить дополнительные значения. Кстати, значения хранятся на Bundle, что в основном обеспечивает способ хранения/получения пар ключ-значение.

Если вы действительно хотите сохранить постоянное состояние, вы должны сделать это по методу , который является частью жизненного цикла Activity. Обратите внимание, что activity documentation говорит:

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

Чтобы избежать проблемы с повторяющимися строками, вам просто нужно проверить, существует ли запись, которую вы пытаетесь сохранить, или нет (для этого вам нужен какой-то уникальный идентификатор), а затем создайте или обновите соответствующим образом.

0

В моем случае, когда он возвращался с , смена камеры + изменение ориентации. Затем я закончил писать Singleton Manager class, чтобы сохранять и восстанавливать мои переменные всякий раз, когда захочу. Этот класс содержит переменные в переменных static final, и вы должны очистить их, когда вы больше не используете его.

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