Activity 状态的保存和恢复

Activity状态保存的两种情况

一、Activity状态保持概念

保存Activity的状态是非常重要的,例如我们在玩一个游戏的时候,突然来了一个电话,这个时候在接听完电话之后我们返回到游戏中,这个时候我们希望游戏还是之前那个进度,或者说发生突发事件,游戏这个应用程序被关闭了,这个时候我们如果再重新打开游戏的话,我们如果还是希望回到之前的进度,我们就需要将其状态保存起来,这样在Activity被摧毁时,我们还能够根据保存的状态回到之前的进度。这就是Activity的状态保存。

二、Activity状态保存的两种情况
当我们的Activity处于stop状态在后台时,系统会自动调用 onSaveInstanceState() 方法,首先我们通过android的官方文档提供的图来看一下具体情况:

1、当由Activity1跳到Activity2时

  • 补充1:此时Activity1处于stop状态,其并不会执行ondestory方法,如果此时点击后退按钮,那么Activity1又会重新回到前台界面上,此种情况下,Activity1默认就会保持原来的状态。
  • 补充2:当由Activity1跳到Activity2然后又由Activity2跳到Activity3后,当从Activity3返回到Activity2再返回Activity1时,Activity1和Activity2也都会保持原来的状态!但是如果Activity2返回Activity1时是通过Intent跳转的,那返回的Activity1并不是初始时的Activity1,而是新建的另外一个Activity1。
  • 补充3:当由Activity1跳到Activity2然后又由Activity2返回Activity1后,Activity2就调用了destory方法,即销毁掉了。所以,当再次由Activity1跳到Activity2时,Activity2也是新建的另一个Activity。
  • 补充4:当由Activity1跳到Activity2然后又由Activity2返回Activity1后,Activity2并不会调用 onSaveInstanceState() 方法,因为此时是我们明显是要关闭activity2的,所以系统认为调用 onSaveInstanceState() 是没有必要的。
  • 补充5:当由Activity1跳到Activity2后,Activity1会调用 onSaveInstanceState() 方法,但是当又由Activity2返回Activity1后,我们不需要从Activity1的onSaveInstanceState中获取任何状态信息,因为此时Activity1本身就完整的保存了当前的状态。

2、当横竖屏切换时,或者系统杀死了处于stop状态的Activity1的线程

  • 当再打开这个Activity时,又会重新创建这个Activity,此时系统会将 onSaveInstanceState 方法中的 Bundle 对象传递给Activity的 onCreate()和 onRestoreInstanceState()方法,使用这两个方法中的任何一个,我们都可以根据之前保存的 Bundle 对象来恢复我们Activity之前的状态。
  • 控件的状态都是被默认保存的,我们一般无须关注。
  • 我们自己定义的某些状态值,比如,int number,我们可以在onSaveInstanceState中保存起来,这样重建Activity时就可以取出来了。
  • 注意,onSaveInstanceState() 方法不能保证一定会被调用,所以我们在onSaveInstanceState() 方法中只能用来保存我们的Activity的临时的状态信息。
  • 我们不需要疑惑这个方法和Activity生命周期函数方法的调用时期,例如onPause()方法,当一个Activity处于后台时或者容易受到破坏时,这个方法就会被调用。

示例代码

public class MainActivity extends Activity {

Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i("bqt", "++++++onCreate");

btn = (Button) findViewById(R.id.btn);

btn.setText("1=="+new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//注意,当由1-->2然后由2-->1后,再由1-->2时,2又执行了oncreate方法,说明是重新创建了一个新的2!

//但是2并没有执行ondestory方法,说明之前的2并没有被销毁,也即内存中是有两个2的!

startActivity(new Intent(MainActivity.this, MainActivity2.class));

}

});

}

@Override

//按返回键

protected void onDestroy() {

Log.i("bqt1", "++++++onDestroy");

super.onDestroy();

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

Log.i("bqt1", "++++++onSaveInstanceState");

}

}


public class MainActivity2 extends Activity {

Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i("bqt2", "++++++onCreate");

btn = (Button) findViewById(R.id.btn);

btn.setText("2=="+new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(MainActivity2.this, MainActivity3.class));

}

});

}

@Override

protected void onDestroy() {

super.onDestroy();

Log.i("bqt2", "++++++onDestroy");

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

Log.i("bqt2", "++++++onSaveInstanceState");

}

}


public class MainActivity3 extends Activity {

private Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i("bqt3", "++++++onCreate");

btn = (Button) findViewById(R.id.btn);

//2-->3-->2后,再由2-->3时肯定是取不出之前保存的状态的,因为那些状态根本不是他保存的!

//横竖屏切换时是可以获取之前的状态的!

if (savedInstanceState != null) btn.setText(savedInstanceState.getString("key"));

else btn.setText("3==" + new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//注意:此时从3-->1是新建了一个1,他已经不是第一个1了!

startActivity(new Intent(MainActivity3.this, MainActivity.class));

}

});

}

@Override

protected void onDestroy() {

super.onDestroy();

Log.i("bqt3", "++++++onDestroy");

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

Log.i("bqt3", "++++++onSaveInstanceState");

outState.putString("key", btn.getText().toString());

}

}


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<Button

android:id="@+id/btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />

</RelativeLayout>

View控件状态的保存

当我们在创建一个Activity对象的时候,我们如果没有重写父类的 onSaveInstanceState()方法,此时我们的一些Activity状态也会通过调用父类Activity的默认的 onSaveInstanceState()方法来保存下来。特别地:父类的onSaveInstanceState()方法会调用布局文件中每一个View对象的相应的 onSaveInstanceState()方法 来保持各自的状态。

在Android的大多数的widget控件都非常好的实现了 onSaveInstanceState()方法,因此我们对这些空间的值的改变都会被自动的保存下来。例如我们的EditText、Checkbox控件,当我们在输入了我们的值后,当Activity被destroy-->recreate的时候,此时我们的值仍然会被保存下来,前提是:如果我们需要保存一个View控件的状态,我们必须通过 android:id 属性给其指定一个唯一的标识符,如果我们没有指定的话,系统则不会保存其状态。

来自为知笔记(Wiz)

时间: 2024-10-10 15:08:47

Activity 状态的保存和恢复的相关文章

Android开发中Activity状态的保存与恢复

当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具体用途举个例子:你正在编辑短信,这时候来了一个电话,打完电话回到短信界面, 短信刚好被系统回收重启,这时原先编辑了一半的内容总不能丢失了吧,这样影响用户体验.所以解决办法如下: 1 private static final String INSTANCE_STATUS="instance_statu

Android中突发情况Activity数据的保存和恢复

Android中突发情况Activity数据的保存和恢复 写在前面:在我们的APP使用的过程中,总有可能出现各种手滑.被压在后台.甚至突然被杀死的情况.所以对APP中一些临时数据或关键持久型数据,就需要我们使用正确的方式进行保存或恢复. 突发情况都有哪些? 因为本文讨论的是当一些突发情况的出现时,对数据的保存和恢复.所以现在总结一下突发情况应该都有哪些? 点击back键 点击锁屏键 点击home键 其他APP进入前台 启动了另一个Activity 屏幕方向旋转 APP被Kill 当这些突发情况发

Canvas状态的保存与恢复

Canvas的API提供了save()和restore()的方法,用于保存及恢复当前canvas绘图环境的所有属性. save()与restore()方法可以嵌套调用 save()方法将当前绘图环境压入堆栈顶部,restore()方法从堆栈顶部弹出一组状态信息,并据此恢复当前绘图环境的各个状态.这意味着可以嵌套调用save()和restore()方法. save() 将当前canvas的状态推送到一个保存canvas状态的堆栈顶部.canvas状态包括了当前的坐标变换(transformatio

android activity状态的保存

今天接到一个电面,途中面试官问到一个问题,如果一个activity在后台的时候,因为内存不足可能被杀死,在这之前如果想保存其中的状态数据,比如说客户填的一些信息之类的,该在哪个方法中进行. onSaveInstanceState虽然不是生命周期的方法,但只要activity在非主动的情况下杀死,就肯定会被调用. onSaveInstanceState方法被调用的需要注意的几个地方: 1.onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期

【Android】11.2 通过重写对应的方法保存和恢复实例的状态

分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 通过重写(也叫回调)对应的方法来管理Activity的生命周期,比如用户旋转屏幕时应用程序要能自动保存和恢复实例的状态,这对于开发一个健壮而又灵活的应用程序而言至关重要. 1.本节要点 一旦真正理解了Activity的生命周期,就可以轻松自如地通过C#代码去控制它了.这一节我们主要学习如何用Boundle存储简单类型的数据(比如int.double.string.bool.--等). 当一个Activity停止

activity状态保存与恢复

Activity的onSaveInstanceState()和 onRestoreInstanceState()方法 Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate().onPause()等生命周期方法,它们并不一定会被触发.当应用遇到意外情况(如:内存不足.用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()才会被调用.但是当用户主

保存和恢复activity的状态数据[转]

转自:here 一般来说,调用onPause()和onStop()方法后的activity实例仍然存在于内存中,activity中的所有信息和状态数据都不会消失,当activity重新回到前台后,所有的改变都会保留. 但是当内存系统内存不足时,调用onPause()和onStop()方法的activity可能被摧毁.此时内存中就不会存在有该activity实例对象了. 为了避免这种情况,我们可以覆盖onSaveInstanceState()方法来接受一个Bundle类型的参数,我们可以将该act

【转】android笔记--保存和恢复activity的状态数据

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveIn

Android课程---Activity中保存和恢复用户状态

onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chenshuai.excise; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View;