Android не сохранит текущее состояние активности
Я пытаюсь сохранить некоторые значения в методе onSaveInstanceState(Bundle) моей активности, следуя приведенному ниже примеру: Сохранение состояния активности Android с помощью Сохранить состояние экземпляра
Но, похоже, он не загружается из Oncreate(). объект bundle всегда нулевой, но всякий раз, когда я вызываю другое действие, он действительно входит в метод onSaveInstanceState, чтобы сохранить мои значения.
Теперь я прочитал тот вопрос, который я только что опубликовал, и кто-то заметил, как они не могли заставить его работать в эмуляторе? к сожалению, это все, над чем я работаю. На эмуляторе и не могу протестировать приложение на устройстве, так как у меня сейчас нет доступного мне устройства. А веб-службы, с которыми я взаимодействую, находятся в локальной виртуальной машине на моей рабочей машине, к которой в данный момент нет удаленного доступа.
У меня вопрос, правда ли, что сохраненные пакеты не работают на эмуляторах? Я также заметил, что когда я закрываю или поднимаю новое действие, оно вызывает OnPause, а затем OnStop. когда я возвращаю ту же самую активность, она сразу переходит на OnCreate?
теперь в соответствии с документами здесь http://developer.android.com/guide/topics/fundamentals.html Это правильно с точки зрения того, что показывает диаграмма жизненного цикла, но если вы читаете ниже этой диаграммы в разделе onStop(), то это говорит, что следующим шагом является onRestart() или onDestroy()? нет упоминания о создании? Типа на документы?
В любом случае, вот мои onSaveInstanceState() и onCreate() в одном и том же упражнении:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
Log.d(TAG, "SAVING OauthManager in onSaveInstanceState");
// TODO: if works, we need to save the my network list HashMap as well
// so we dont make a call to the platform everytime we refresh this
// screen
// savedInstanceState.putSerializable("oauthManager", mOathManager);
// Log.d(TAG, "finished saving");
// super.onSaveInstanceState(savedInstanceState);
// Log.d(TAG, "super.onSaveInstanceState(savedInstanceState)");
savedInstanceState.putString(USER_CONSUMER_ID,
mSavedUserConsumerTokenId);
savedInstanceState.putString(USER_CONSUMER_SECRET,
mSavedUserConsumerSecret);
savedInstanceState.putString(URL_REQUEST_TOKEN, mSavedRequestTokenUrl);
savedInstanceState.putString(URL_ACCESS_TOKEN, mSavedAccessTokenUrl);
savedInstanceState.putString(URL_AUTHORIZE_TOKEN,
mSavedAuthorizeTokenUrl);
super.onSaveInstanceState(savedInstanceState);
}
Мой onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.d(TAG, " ");
Log.d(TAG, "onCreate");
Log.d(TAG, "///////////////////////////////////////");
Log.d(TAG, "///////////////////////////////////////");
super.onCreate(savedInstanceState);
Log.d(TAG, "super.onCreate(savedInstanceState);");
setContentView(R.layout.network_list);
mContext = getApplicationContext();
mIntent = getIntent();
mGoogleButton = (Button) findViewById(R.id.googleAddOrRemoveButton);
mFacebookButton = (Button) findViewById(R.id.facebookAddOrRemoveButton);
mLinkedInkButton = (Button) findViewById(R.id.linkedInAddOrRemoveButton);
mPopEmailButton = (Button) findViewById(R.id.popEmailAddOrRemoveButton);
if (savedInstanceState != null) {
Log.d(TAG, "inside if (savedInstanceState != null) {");
Log.d(TAG, "savedInstanceState != null");
// mOathManager = (OAuthManager) savedInstanceState
// .getSerializable("oauthManager");
mSavedUserConsumerTokenId = savedInstanceState
.getString(USER_CONSUMER_ID);
mSavedUserConsumerSecret = savedInstanceState
.getString(USER_CONSUMER_SECRET);
mSavedRequestTokenUrl = savedInstanceState
.getString(URL_REQUEST_TOKEN);
mSavedAccessTokenUrl = savedInstanceState
.getString(URL_ACCESS_TOKEN);
mSavedAuthorizeTokenUrl = savedInstanceState
.getString(URL_AUTHORIZE_TOKEN);
mOathManager = new OAuthManager(mContext, getIntent(),
mSavedUserConsumerTokenId, mSavedUserConsumerSecret,
mSavedRequestTokenUrl, mSavedAccessTokenUrl,
mSavedAuthorizeTokenUrl, CALLBACK_URI);
mOathManager.requestUserRequestToken();
} else{
Log.d(TAG, "savedInstanceState is null and loading the list again");
GetNetworkListTask getNetworkListTask = new GetNetworkListTask();
getNetworkListTask.execute();
}
}
1 ответ
объект bundle всегда нулевой, но всякий раз, когда я отклоняю активность, он действительно входит в метод onSaveInstanceState, чтобы сохранить мои значения.
Если под "отклонить" вы подразумеваете "нажать кнопку НАЗАД", то Bundle
от onSaveInstanceState()
(если таковые имеются) отбрасывается, так как пользователь указал, что они закончили с действием. onSaveInstanceState()
Bundle
используется в тех случаях, когда пользователь еще не сказал, что завершил действие (например, принял входящий телефонный звонок), а Android решает уничтожить действие, чтобы освободить ОЗУ.
У меня вопрос, правда ли, что сохраненные пакеты не работают на эмуляторах?
onSaveInstanceState()
прекрасно работает в эмуляторе. Самый простой способ проверить onSaveInstanceState()
в эмуляторе можно было бы изменить ориентацию экрана ([Ctrl]-[F11]).
Я также заметил, что когда я закрываю или поднимаю новое действие, оно вызывает OnPause, а затем OnStop. когда я возвращаю ту же самую активность, она сразу переходит на OnCreate?
У вас есть некоторые фундаментальные недоразумения относительно Android, выходящие далеко за рамки одного ответа Stackru.
но если вы прочтете эту диаграмму в разделе onStop(), то там будет сказано, что следующим шагом является onRestart() или onDestroy()? нет упоминания о создании? Типа на документы?
Диаграмма в целом правильная. Есть сценарии, в которых onDestroy()
не вызывается (например, экстренное восстановление ОЗУ, вынуждающее ваш процесс быть убитым), но это редко.