Android:onSaveInstanceState未从活动中调用

Bha*_*ath 54 android android-activity

我有一个活动A,它调用活动B.在活动B中,当我点击一个按钮时,调用finish(),然后调用活动B的onDestroy()并返回活动A.

根据android文档,在调用on 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);

    }
Run Code Online (Sandbox Code Playgroud)

并且下次从活动A开始活动B,

在oncreate()中,我执行以下操作:

onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

if(savedInstanceState != null){
//restore webview
}else {
// code
}
}
Run Code Online (Sandbox Code Playgroud)

但是,在活动B中调用onDestroy之前,永远不会调用onSaveInstanceState方法.任何有关这方面的帮助将不胜感激.

编辑:如果这是不可能的.如果有办法存储webview状态,请告诉我

Paw*_*zur 264

我有类似的情况.这显然是一个开发者的错误.我已经覆盖了错误的方法:

public void onSaveInstanceState(Bundle outState, 
                                PersistableBundle outPersistentState)
Run Code Online (Sandbox Code Playgroud)

而是一个正确的:

protected void onSaveInstanceState(Bundle outState)
Run Code Online (Sandbox Code Playgroud)

  • 鉴于这个答案的受欢迎程度,我想使用相同的名称用于不同的目的并不是一个很好的API选择. (13认同)
  • 实际上它不是一个bug,还有另一个`onSaveInstanceState`的重载方法,但它的修饰符是***受保护的***不是***public***.受保护的重载是我们需要覆盖以保存状态. (6认同)
  • 来自文档:这与 onSaveInstanceState(Bundle) 相同,但为使用属性 R.attr.persistableMode 设置为 persistAcrossReboots 创建的活动调用。传入的 PersistableBundle 将在下次设备重启后第一次重新启动此活动时保存并呈现在 onCreate(Bundle, PersistableBundle) 中。 (4认同)
  • 代码完成表明这种方法是FragmentActivity的一部分,这足以让我感到困惑. (3认同)
  • 两者有什么区别? (3认同)

Mar*_* S. 53

请注意onRestoreInstanceState()在重新创建活动时调用,但仅限于:

它被操作系统杀死了."这种情况发生在:

  • 设备的方向发生变化(您的活动被破坏并重新创建)
  • 在你面前还有另一项活动,在某些时候,操作系统会杀死你的活动以释放内存(例如).下次你开始活动的时候onRestoreInstanceState()会被叫到."

因此,如果您正在进行活动并点击设备上的" 后退"按钮,则会对您的活动进行finish()编辑,下次启动应用时它会再次启动(听起来像重新创建,不是吗?)但这次没有保存状态,因为你有意退出它,当你点击后退按钮.


fan*_*com 6

请参阅此处的文档: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)在活动A前启动活动B时:onSaveInstanceState(Bundle)如果在B的生命周期内没有杀死活动A,则系统可以避免调用活动A,因为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
 }
Run Code Online (Sandbox Code Playgroud)

我不确定if语句的目的是什么,但试试看看会发生什么.

  • 在onpause()中,bundle"outstate"是声明为类变量Bundle outstate的活动的一部分; 当活动再次开始时.在onCreate和onResume中,bundle outstate将为null. (2认同)