首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android: onSaveInstanceState未从activity中调用

Android: onSaveInstanceState未从activity中调用
EN

Stack Overflow用户
提问于 2012-10-09 12:59:21
回答 5查看 51.9K关注 0票数 66

我有一个活动A,它调用活动B。在活动B中,当我单击一个按钮时,将调用finish(),它又调用活动B的onDestroy()并返回到活动A。

根据安卓文档,在调用onDestroy之前,将调用onSaveInstanceState(Bundle bundle),我将在其中执行以下操作。

代码语言:javascript
运行
复制
@Override
    public void onSaveInstanceState(Bundle outState) {

        super.onSaveInstanceState(outState);
        System.out.println("Saving webview state");
        Log.d(TAG, "In onsave");
        wv.saveState(outState);

    }

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

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

代码语言:javascript
运行
复制
onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

if(savedInstanceState != null){
//restore webview
}else {
// code
}
}

但是,在活动B中调用onDestroy之前,从不调用onSaveInstanceState方法。在这方面的任何帮助都将非常感谢。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-09 13:33:48

请注意,在重新创建活动时会调用onRestoreInstanceState(),但仅在以下情况下才会调用:

它被OS杀死了。“这种情况在以下情况下发生:

设备的

  • 方向发生变化(例如,您的活动被销毁,recreated)
  • there是您面前的另一个活动,并且在某些情况下,操作系统为了释放内存而终止您的活动)。下次启动activity时,将调用onRestoreInstanceState()。“

所以,如果你在你的活动中,你点击了设备上的Back按钮,你的活动就是finish()ed,下次你启动你的应用程序时,它会再次启动(听起来像是重新创建的,不是吗?)但这次没有保存状态,因为您在单击Back按钮时故意退出了它。

票数 60
EN

Stack Overflow用户

发布于 2015-11-19 19:01:54

我也遇到过类似的情况。这显然是一个开发错误。我重写了错误的方法:

代码语言:javascript
运行
复制
public void onSaveInstanceState(Bundle outState, 
                                PersistableBundle outPersistentState)

取而代之的是正确的

代码语言:javascript
运行
复制
protected void onSaveInstanceState(Bundle outState)
票数 344
EN

Stack Overflow用户

发布于 2012-10-09 13:04:13

请参阅此处的文档:http://developer.android.com/reference/android/app/Activity.html

请注意,将持久化数据保存在onPause()中而不是onSaveInstanceState(Bundle)中很重要,因为后者不是生命周期回调的一部分,因此不会像文档中描述的那样在每种情况下都被调用。

onSaveInstanceState方法的文档中写道,

不要将此方法与活动生命周期回调(如onPause() )或onStop() (在销毁之前调用)混淆,活动生命周期回调总是在活动被置于后台或销毁过程中调用。调用onPause()onStop()而不调用此方法的一个示例是,当用户从活动B导航回活动A时:不需要在B上调用onSaveInstanceState(Bundle),因为该特定实例永远不会被还原,因此系统会避免调用它。一个调用onPause()而不是onSaveInstanceState(Bundle)的例子是,当activity B在activity A之前启动时:如果activity A在activity A的生命周期内没有被终止,系统可能会避免调用activity A的onSaveInstanceState(Bundle),因为A的用户界面状态将保持不变。

试试这个:

代码语言:javascript
运行
复制
@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语句的目的是什么,但尝试一下,看看会发生什么。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12793069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档