onRestoreInstanceState方法何时被调用?

44

对于我的理解不足,我很抱歉,我是Android开发的新手。

我的应用程序中有Activity A和Activity B,并且我从Activity A转到Activity B。当我离开Activity A时,调用了onSaveInstanceState方法,但是当我从同一应用程序的Activity B返回到Activity A时,在onCreate方法中的Bundle参数值为空。

我该怎么办,才能保存Activity A的先前状态?我只想在应用程序的生命周期内存储数据。

有人能帮帮我吗?

这是Activity A的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null)
    {
        Log.v("Main", savedInstanceState.getString("test"));
    }
    else
    {
        Log.v("Main", "old instance");
    }
}  

@Override
public void onSaveInstanceState(Bundle savedInstanceState) 
{
    Log.v("Main", "save instance");

    savedInstanceState.putString("test", "my test string");

    super.onSaveInstanceState(savedInstanceState);
}


public void buttonClick(View view)
{
    Intent intent = new Intent(this, Activity2.class);
    startActivity(intent);
}

这是我编写的Activity B代码,当我按下返回到Activity A的按钮时:

public void onBack(View view)
{
    NavUtils.navigateUpFromSameTask(this);
}

发布你的代码,让我们看看你是如何节省开销的。 - Triode
1
请查看http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)。 - Nermeen
2
可能是重复的问题:https://dev59.com/aWw15IYBdhLWcg3whMO_ - npace
我刚刚发布了我的代码。 - Tünde
6个回答

59

25
感谢回答标题中的问题 =) - user2329125

29

保存和恢复状态是指保存当前在用户退出应用程序时过时的临时数据。

当您最小化或离开活动并打开下一个活动时,系统可能会由于资源不足而终止该活动,并在您返回时使用 savedInstanceState 重新启动。因此,仅将 onSaveInstanceState() 用于保存最小化-恢复会话数据或应在旋转时保留的数据。

因此,如果您在前面启动了一个新的活动并返回到之前的活动(您正在尝试执行的操作),则活动 A 可能不会被终止(只是停止),并在未被销毁的情况下重新启动。您可以通过在开发人员选项菜单中检查“不保留活动”来强制终止它并进行恢复。

如果您调用 finish() 或从最近任务列表中删除 Activity,则由于任务已清除,savedInstanceState 不会传递给 onCreate()

如果值必须是持久性的,请考虑使用 SharedPreferences。


  1. 我尝试了,但没有任何改变。
  2. 如果活动A可能不会重新启动,我应该获取这个日志信息吗:Log.v("Main", "old instance")?
- Tünde
1
我的意思是,如果调用了onSaveInstanceState方法,并不保证你会收到Bundle。只有在Activity之前被系统杀死的情况下,才会调用onRestoreInstanceState方法。 - Yaroslav Mytkalyk
只需将值存储为字段,并将保存添加到onSaveInstanceState和恢复到onRestoreInstanceState和onCreate中,就完成了。 - Yaroslav Mytkalyk
1
@Peter:另一种说法是,如果您没有收到onRestoreInstanceState的调用,那么您不需要它,因为您没有丢失状态。 - G. Blake Meike
1
非常感谢您告诉我关于“不保留活动”的事情,这真的帮助我更好地调试应用程序。谢谢您的帮助 :) - beginner
显示剩余3条评论

4

reference

onSaveInstanceState

... onPause()-> onSaveInstanceState() -> onStop() -> onDestory()

onRestoreInstanceState

onCreate()-> onStart()-> onRestoreInstanceState()-> onPostCreate(Bundle) ...

或者您可以使用LiveData。将状态保存在其中并进行观察。如果设备旋转,它将相应地更新视图。


3

出现这种情况是因为您采用了较为复杂的导航方式。如果使用手机自带的后退按钮导航,则可以在onCreate中获取传递的包。

为了规避此问题,建议您将状态保存到共享首选项以及备份中。当包为空时,从共享首选项中恢复它。


2

在onCreate()之后是onStart()


0
在这种情况下,我使用了一个标志和SharedPreferences。这应该是有效的,并且当您更改屏幕方向时也会正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接