【问题标题】:when is onRestoreInstanceState called?何时调用 onRestoreInstanceState?
【发布时间】:2013-03-12 13:25:02
【问题描述】:

对不起,我的不理解,但我是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);
}

【问题讨论】:

标签: android android-lifecycle onsaveinstancestate onrestoreinstancestate


【解决方案1】:

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

上面说onRestoreInstanceState是在activity生命周期的onStart()方法之后调用的。

【讨论】:

  • 感谢您回答标题中提出的问题 =)
【解决方案2】:

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

因此,如果您在前面启动一个新 Activity 并返回到前一个 Activity(您正在尝试执行的操作),则 Activity A 可能不会被杀死(只是停止)并重新启动而不会被破坏。您可以通过在开发者选项菜单中检查Don't keep activities 来强制杀死它并恢复。

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

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

【讨论】:

  • 1.我试过了,没有任何改变,2. 如果 Activity A 可能没有重新启动,我应该得到这个日志消息:Log.v("Main", "old instance") 吗?
  • 我的意思是,如果调用 onSaveInstanceState 并不能保证您会收到捆绑包。仅当活动之前被系统杀死时才会调用 onRestoreInstanceState。
  • 你能给我一些提示吗?我怎样才能从我的活动中保存值(这只会在我的应用程序生命周期中保持不变)
  • @Peter:Doctoror 所说的另一种说法是,如果你没有接到 onRestoreInstanceState 的调用,你就不需要它,因为你还没有失去你的状态。
  • 非常感谢您告知我“不要保留活动”这真的有助于我更好地调试应用程序。谢谢你的帮助:)
【解决方案3】:

发生这种情况是因为您走得很艰难。如果您使用手机的默认后退按钮导航,您的 onCreate 将获得传递的包。

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

【讨论】:

    【解决方案4】:

    reference

    onSaveInstanceState

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

    onRestoreInstanceState

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

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

    【讨论】:

      【解决方案5】:

      onStart() 之后 onCreate() 之后

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          相关资源
          最近更新 更多