什么时候onRestoreInstanceState调用?

时间:2013-03-12 13:25:02

标签: android android-lifecycle onsaveinstancestate onrestoreinstancestate

对不起我的不理解,但我是android开发的新手。

我有一个活动A和活动B的应用程序,我从活动A转到活动B.当我离开活动A时,调用了onSaveInstanceState方法,但是当我回到活动A时(来自同一应用程序中的活动B),onCreate方法中的包为空。

我可以做些什么来保存活动A以前的状态?我只想存储应用程序生命周期的数据。

有人可以帮我这个吗?

以下是我的活动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);
}

这是我的活动B的代码,当我按下按钮返回活动A:

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

6 个答案:

答案 0 :(得分:44)

要回答您的问题,请查看android doc:https://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)

它表示onRestoreInstanceState是在活动生命周期中的onStart()方法之后调用的。

答案 1 :(得分:24)

保存和恢复状态旨在保存用户退出应用程序时过时的当前临时数据。 当您通过打开下一个最小化或离开活动时,由于缺少资源可能会被系统杀死,并在您返回时使用savedInstanceState重新启动。因此,仅使用onSaveInstanceState()来保存最小化还原会话数据。

因此,如果你在前面开始一个新的Activity并返回到前一个(你想要做的事情),那么活动A可能不会被杀死(只是停止)并重新启动而不会被破坏。您可以通过选中开发人员选项菜单中的Don't keep activities来强行终止并恢复。

如果您致电finish()或从最近的任务列表中删除Activity,则savedInstanceState将不会传递给onCreate(),因为任务已清除。

如果值必须持久,请考虑使用SharedPreferences.

答案 2 :(得分:3)

这是因为你正在艰难地进行导航。如果您使用手机的默认后退按钮导航,则onCreate会传输捆绑包。

为避免此问题,我建议您将状态保存为共享首选项以及备份。当bundle为null时,从共享首选项中恢复它。

答案 3 :(得分:2)

onStart()之后的onStart()

答案 4 :(得分:1)

reference

onSaveInstanceState

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

onRestoreInstanceState

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

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

答案 5 :(得分:0)

我在这种情况下使用了一个标志和SharedPreferences。这应该有效,并且当您更改屏幕方向时。