Подтвердить что ты не робот

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: если это невозможно. Пожалуйста, дайте мне знать, есть ли способ сохранить состояние веб-просмотра.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

public void onSaveInstanceState(Bundle outState, 
                                PersistableBundle outPersistentState)

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

protected void onSaveInstanceState(Bundle outState)

Ответ 3

Смотрите документ здесь: 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, но попробуйте это и посмотрите, что произойдет.

Ответ 4

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

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

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

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

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

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

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