Android: onSaveInstanceState не вызывается из активности

У меня есть Activity A, который вызывает Activity B. В Activity B, когда я нажимаю кнопку, вызывается функция finish (), которая в свою очередь вызывает onDestroy () Activity B и возвращается к активности A.

Согласно документации по android, до вызова onDestroy, будет вызываться onSaveInstanceState (Bundle bundle), где я делаю следующее.

@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); System.out.println("Saving webview state"); Log.d(TAG, "In onsave"); wv.saveState(outState); } 

И в следующий раз, когда действие B начинается с действия A,

В oncreate (), я делаю следующее:

 onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); if(savedInstanceState != null){ //restore webview }else { // code } } 

Однако перед вызовом onDestroy в Activity B метод onSaveInstanceState никогда не вызывается. Любая помощь в этом будет принята с благодарностью.

EDIT: если это невозможно. Пожалуйста, дайте мне знать, есть ли способ сохранить состояние веб-просмотра

Solutions Collecting From Web of "Android: onSaveInstanceState не вызывается из активности"

Обратите внимание, что onRestoreInstanceState() вызывается, когда активность воссоздана, но только если:

Он был убит ОС . «Такая ситуация возникает, когда:

  • Ориентация устройства изменяется (ваша деятельность уничтожается и воссоздается)
  • Есть еще одна активность перед вами, и в какой-то момент ОС убивает вашу активность, чтобы освободить память (например). В следующий раз, когда вы начнете свою деятельность onRestoreInstanceState() . "

Поэтому, если вы находитесь в своей деятельности, и вы нажимаете кнопку «Назад» на устройстве, ваша деятельность finish() ed, и в следующий раз, когда вы запустите приложение, оно снова запускается (похоже, что оно было заново создано, не так ли?), Но это Без сохранения состояния, потому что вы намеренно покинули его, когда вы нажимаете кнопку «Назад».

У меня была аналогичная ситуация. Это явно ошибка разработчиков. Я переопределил неправильный метод:

 public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) 

Вместо этого правильный :

 protected void onSaveInstanceState(Bundle outState) 

См. Документ здесь: http://developer.android.com/reference/android/app/Activity.html

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

Документация метода onSaveInstanceState говорит:

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

попробуй это:

 @Override public void onPause(){ System.out.println("Saving webview state"); Log.d(TAG, "In onsave"); wv.saveState(outState); super.onPause(); } and @Override public void onResume(){ //restore webview } 

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

В конце концов вам придется записывать назад / историю в постоянное хранилище. В случае отключения устройства в качестве одного из примеров, а также избегая придуманного (на мой взгляд) примера, в котором вы вызываете onSaveInstanceState в onPause (что вам нужно сделать, чтобы получить пакет, который вы хотите передать в onRestoreInstanceState который вы Затем может перейти в restoreState ).

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

К сожалению, вы не можете поместить пакет в общие настройки, и я не рекомендую пытаться написать пакет через Parcelable (он предназначен только для IPC, а не для постоянного хранения). Но вы можете сохранить все примитивы, которые хранится в комплекте. Это тоже может быть надуманно, но мне кажется единственным способом получить постоянное хранилище.

А затем перестройте свой пакет через примитивы, хранящиеся в SharedPreferences, и передайте это в restoreState() . Вы можете проверить исходный код Android, чтобы узнать, что на webView.saveState() деле делает webView.saveState() (я искал код 2.1 и, похоже, писал int, сериализуемый объект, а затем еще один пакет для SSL-сертификата. Всего четыре целых числа). В верхней части моей головы я просто напишу все примитивы, которые вы можете, а затем сохраните местоположение (строку) локального файла, который вы также запишете сериализованными данными.

Даже если у вас есть упорядоченная коллекция всего списка BackForward, я не уверен, как перевести это в goBack() и goForward() используя эти значения (есть защищенный метод, который участвует в добавлении элементов в список, но вы можете 'T доступ к этому). ЕСЛИ вы используете restoreState() , поэтому мы перейдем ко всей работе, чтобы правильно перестроить пакет.

Серьезно, хотя, если мои навыки поиска не являются абсурдными (полностью возможными), сохраняя историю WebView в местах, где saveInstanceState/restoreInstanceState может выполнять вашу работу за вас, похоже, не проблема, с которой сталкиваются многие люди. Т.е. не многие люди пытаются сохранить историю WebView, когда пользователь явно закрывает свое приложение, поэтому вы должны спросить себя, почему вы это делаете?

Извините, если есть действительно простой способ настойчиво хранить эту информацию и перезагружать в WebView btw!