44

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

6 回答 6

59

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

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

于 2014-10-04T08:05:19.627 回答
28

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

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

如果您从最近的任务列表中调用finish()或删除该任务,则该任务被清除后将不会被传递。ActivitysavedInstanceStateonCreate()

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

于 2013-03-12T13:41:19.633 回答
3

发生这种情况是因为您正在艰难地航行。如果您使用手机的默认后退按钮导航,您onCreate将获得传入的捆绑包。

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

于 2013-05-02T15:26:46.740 回答
3

参考

onSaveInstanceState

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

onRestoreInstanceState

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

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

于 2020-03-06T05:32:57.080 回答
2

在 onStart() 之后,在 onCreate() 之后

于 2016-07-18T15:35:27.327 回答
0

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

于 2015-05-19T18:13:12.513 回答