【问题标题】:Android onSaveInstanceState and starting sub-activities.Android onSaveInstanceState 和启动子活动。
【发布时间】:2011-12-18 12:56:20
【问题描述】:

我有一个应用程序,它有一个主要活动,可以在按下按钮时调用其他活动。

主要活动托管一个包含大量数据且可打包的类。数据是应用程序的主干,我需要在方向更改时保存它。为了实现这一点,它使用 onSaveInstanceState 并将 parcelable 对象放入包中。

但是,我注意到每次按下按钮并启动一项新活动以及方向更改时都会调用 onSaveInstanceState。这略微减慢了向其他屏幕的过渡。

有没有一种好方法可以仅在我确定 Activity 将被销毁时才存储此信息,而不是每次我定期离开 Activity 时才存储此信息。我明白,当我离开主要活动的那一刻,它就有可能被破坏。

谢谢, 男

【问题讨论】:

  • 您想知道在 Activity 被销毁之前保存应用程序状态的更好方法吗?
  • 可能有的话。当活动刚刚进入后台而另一个简短的活动被调用时,我正在寻找那个或不调用 saveInstancestate 的方法。

标签: android


【解决方案1】:

对于原始值,您应该使用onSaveInstanceState。要恢复,您可以使用onRestoreInstanceState 或者您可以使用onCreate 中的一些代码,如下所示:

if(savedInstanceState != null) {
  // restore old state
} else {
  // a fresh start
}

现在要恢复像Bitmap 等大对象,如果它们的创建成本不高并且不会使您的用户界面变得迟缓,请在恢复时再次创建它们。如果您不想这样做,请使用onRetainNonConfigurationInstance,代码将如下所示:

@Override
public Object onRetainNonConfigurationInstance () {
  return bmp;
}

@Override
public void onCreate() {

  bmp = (Bitmap)getLastNonConfigurationInstance();
}

警告:此 api 已弃用,您可能会在旧平台上使用它。我把它放在这里是为了说明。做到这一点的新方法更具参与性。

这里有详细的参考:

getLastNonConfigurationInstance

onRetainNonConfigurationInstance

新 API 级别 11 及以上的推荐解决方案:

“请改用新的 Fragment API setRetainInstance(boolean);这也可通过 Android 兼容包在旧平台上使用。”当您单击上面的链接时,从文档中获取 sn-p。

因此,您将在片段内创建位图并在片段上调用setRetainInstance,以便在配置更改时保留片段及其内容(在您的情况下为位图)。

参考:

setRetainInstance

【讨论】:

  • 您好,感谢您的回答。看起来我需要做的是类似于 onRetainNonConfigurationInstance 的事情 - 不推荐使用的方法是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多