使用保存实例状态保存Android活动状态

我一直在研究Android SDK平台,并且如何保存应用程序的状态还有点不清楚。 因此,考虑到对'Hello,Android'示例的轻微重新设计:

package com.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {

  private TextView mTextView = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mTextView = new TextView(this);

    if (savedInstanceState == null) {
       mTextView.setText("Welcome to HelloAndroid!");
    } else {
       mTextView.setText("Welcome back.");
    }

    setContentView(mTextView);
  }
}

我认为对于最简单的情况就足够了,但无论我如何离开应用程序,它总是以第一条消息作为响应。

我敢肯定,解决方案就像覆盖onPause或类似的东西一样简单,但我一直在文档中戳了30分钟左右,并没有发现任何明显的东西。


您需要重写onSaveInstanceState(Bundle savedInstanceState)并将您想要更改为Bundle参数的应用程序状态值写入如下所示:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("MyBoolean", true);
  savedInstanceState.putDouble("myDouble", 1.9);
  savedInstanceState.putInt("MyInt", 1);
  savedInstanceState.putString("MyString", "Welcome back to Android");
  // etc.
}

Bundle本质上是一种存储NVP(“名称 - 值对”)映射的方式,它将被传递给onCreate()以及onRestoreInstanceState() ,您可以像这样提取值:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
  double myDouble = savedInstanceState.getDouble("myDouble");
  int myInt = savedInstanceState.getInt("MyInt");
  String myString = savedInstanceState.getString("MyString");
}

您通常会使用此技术为应用程序存储实例值(选择,未保存的文本等)。


savedInstanceState仅用于保存与Activity的当前实例关联的状态,例如当前的导航或选择信息,这样,如果Android销毁并重新创建Activity,则它可以恢复到之前的状态。 请参阅onCreateonSaveInstanceState的文档

对于更长时间的状态,考虑使用SQLite数据库,文件或首选项。 请参阅保存持久状态。


请注意,这不是安全使用onSaveInstanceStateonRestoreInstanceState 持久性数据 ,根据http://developer.android.com/reference/android/app/Activity.html上的活动状态的文档。

文档陈述(在'Activity Lifecycle'部分):

请注意,将持久数据保存在onPause()而不是onSaveInstanceState(Bundle)很重要,因为后者不是生命周期回调的一部分,所以在其文档中描述的每种情况下都不会调用它。

换句话说,将持久数据的保存/恢复代码放在onPause()onResume()

编辑 :为了进一步澄清,这里是onSaveInstanceState()文档:

在一个活动可能被杀死之前调用这个方法,以便在将来它有一段时间它可以恢复它的状态。 例如,如果活动B在活动A之前启动,并且在某些时刻活动A被杀死以回收资源,则活动A将有机会通过此方法保存其用户界面的当前状态,以便当用户返回时到活动A,可以通过onCreate(Bundle)onRestoreInstanceState(Bundle)恢复用户界面的状态。

链接地址: http://www.djcxy.com/p/673.html

上一篇: Saving Android Activity state using Save Instance State

下一篇: Git fetch remote branch