概念:

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

生命图:

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.

但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.

需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前,所以我们在onSaveInstanceState() 方法中只能用来保存我们的Activity的临时的状态信息,而对于要持久化保存的对象或状态,我们应该在 onPause() 方法中来做

界面:

代码:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "logmain";private Button button;private EditText name;private CheckBox soccer;private CheckBox basketball;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);name = (EditText) this.findViewById(R.id.editText);soccer = (CheckBox) this.findViewById(R.id.cbsoccer);basketball = (CheckBox) this.findViewById(R.id.cbbasketball);button = (Button) this.findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent i = new Intent(MainActivity.this, NextActivity.class);startActivity(i);}});//通过onCreate取值if (savedInstanceState != null) {String s = savedInstanceState.getString("name");boolean cbsoccer = savedInstanceState.getBoolean("soccer");boolean cbbasketball = savedInstanceState.getBoolean("basketball");//测试1/* name.setText("oncreatename");soccer.setChecked(true);basketball.setChecked(false);*///赋值1
            name.setText(s);soccer.setChecked(cbsoccer);basketball.setChecked(cbbasketball);}Log.i(TAG, "---Main onCreate---");}@Overrideprotected void onStart() {super.onStart();Log.i(TAG, "---Main onStart---");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {//调用activity的onRestoreInstanceState得到保存的值//如果赋值1注释了 测试1开放  再把 super.onRestoreInstanceState(savedInstanceState)和通过onRestoreInstanceState取值注释//旋转屏幕就是测试1的值super.onRestoreInstanceState(savedInstanceState);//通过onRestoreInstanceState取值/*if (savedInstanceState != null) {String s = savedInstanceState.getString("name");boolean cbsoccer = savedInstanceState.getBoolean("soccer");boolean cbbasketball = savedInstanceState.getBoolean("basketball");//测试2//name.setText("onrestorename");//soccer.setChecked(false);//basketball.setChecked(true);//赋值2name.setText(s);soccer.setChecked(cbsoccer);basketball.setChecked(cbbasketball);}*/Log.i(TAG, "---Main onRestoreInstanceState---");}@Overrideprotected void onResume() {super.onResume();Log.i(TAG, "---Main onResume---");}@Overrideprotected void onPause() {super.onPause();Log.i(TAG, "---Main onPause---");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//通过onSaveInstanceState存值outState.putString("name", name.getText().toString().trim());outState.putBoolean("soccer", soccer.isChecked());outState.putBoolean("basketball", basketball.isChecked());Log.i(TAG, "---Main onSaveInstanceState---");}@Overrideprotected void onStop() {super.onStop();Log.i(TAG, "---Main onStop---");}@Overrideprotected void onRestart() {super.onRestart();Log.i(TAG, "---Main onRestart---");}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TAG, "---Main onDestroy---");}}

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.liang.activitydemo.MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textAppearance="?android:attr/textAppearanceMedium"android:text="Name:"android:id="@+id/tvok"android:layout_alignParentTop="true"android:layout_alignParentStart="true" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="textPersonName"android:ems="10"android:id="@+id/editText"android:layout_alignParentTop="true"android:layout_toEndOf="@+id/tvok" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textAppearance="?android:attr/textAppearanceMedium"android:text="Hobby:"android:id="@+id/tvhobby"android:layout_below="@+id/editText"android:layout_alignParentStart="true" /><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Soccer"android:id="@+id/cbsoccer"android:layout_below="@+id/editText"android:layout_toEndOf="@+id/tvhobby"android:checked="false" /><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Basketball"android:id="@+id/cbbasketball"android:layout_below="@+id/editText"android:layout_toEndOf="@+id/cbsoccer"android:checked="false" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Next"android:id="@+id/button"android:layout_below="@+id/cbsoccer"android:layout_alignParentStart="true" /></RelativeLayout>

测试:注意顺序

06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onPause---
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onSaveInstanceState---(存值)
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onStop---
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onDestroy---
06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onCreate---(取值方法1)
06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onStart---
06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onRestoreInstanceState---(取值方法2)
06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onResume---

转载于:https://www.cnblogs.com/manusas/p/5519644.html

1.4Activity保存现场状态相关推荐

  1. 保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()

    当某个activity变得"容易"被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK ...

  2. Windows系统调用学习笔记(三)—— 保存现场

    Windows系统调用学习笔记(三)-- 保存现场 要点回顾 基本概念 Trap Frame 结构 线程相关的结构体 ETHREAD KTHREAD CPU相关的结构体 KPCR _NT_TIB KP ...

  3. ARM保存现场和恢复现场解读

    arm汇编指令调用函数的时候,需要保存现场和回复现场 1.1 解读: 为什么我们的c语言程序可以调用其他函数后,继续回来执行我们的代码,而他的其他值没有变呢.编译器又是怎么做的,怎么确保我们的值不变, ...

  4. 微信小程序 获取用户信息并保存登录状态

    微信小程序 获取用户信息并保存登录状态:http://www.360doc.com/content/18/0124/11/9200790_724662071.shtml 转载于:https://www ...

  5. HTML5 Canvas save 保存恢复状态

    保存恢复状态 在绘画的时候,经常会有这种情况,本来正在用绿色笔画,突然需要用红色笔画几笔,但画完了之后又要换成绿色笔.如果是在现实中作画,可以把笔蘸上不同的墨水,画了之后又蘸上之前的墨水,或者准备几只 ...

  6. html 修改按回退键的url,location.hash保存页面状态的技巧

    hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分). 语法 location.hash 在我们的项目中,有大量ajax查询表单+结果列表的页面,由于查询结果是a ...

  7. vue如何保存登录状态到全局?【vue状态管理】

    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习 ...

  8. oracle19c查看pdb表空间,19c pdb如何保存启动状态

    我们要保存pdb状态,首先要了解视图DBA_PDB_SAVED_STATES显示了当前CDB中保存的pdb状态信息. This view is a data link, so the data is ...

  9. 失败狮计划——在localStorage中保存vuex状态

    前言 最近碰到了这么一个需求变动:在当前页点击一个按钮打开一个新的页签(本来是在当前页通过路由跳转进入一个新的组件),对于传统jq项目来说这个应该是不费吹灰之力可以实现的,但是对于vue项目来说就要好 ...

最新文章

  1. c语言一对圆括号不能,C语言单元习题集
  2. 实际上,Python 3.3中新的“ yield from”语法的主要用途是什么?
  3. 耻辱的时间戳(笑哭)
  4. LiveVideoStackCon讲师热身分享第一季
  5. [转]SQL语句资料
  6. springboot mybatis 热加载mapper.xml文件(最简单)
  7. 面试项目亮点_码农:面试被问到自己项目亮点时,感觉自己的回答虚伪的不行!...
  8. 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
  9. 鸿蒙os2.0开发者beta版,鸿蒙 OS 2.0 开发者beta版针对Mate 40系列设备开放
  10. px4代码解析(3)
  11. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
  12. python化学公式_(CSP)201912-3化学方程式-python实现
  13. php设计模式 -- 迭代器模式
  14. [thinkphp] page类整合bootstrap分页样式
  15. 根据车辆型号自动生成车辆编号
  16. 区块链开源代码什么意思_区块链可以从开源中学到什么
  17. (二十)美萍酒店管理系统:系统维护_系统设置_房间类型_单个添加、多个添加
  18. Linux安全模块(LSM)学习——简单的LSM demo(1)
  19. 电信光猫 DDNS路由设置-基于DNSPOD
  20. 定时器-----每天定时删除临时文件

热门文章

  1. bisect git 使用_让 Git Bisect 帮助你
  2. python c cmd_在Python cmd模块中处理CTRL-C
  3. zabbix入门之添加主机
  4. ASP.NET Core 网站发布到Linux服务器
  5. Action和Func区别
  6. 关于android 调用网页隐藏地址栏
  7. dlp防泄密系统卸载_怎样做好数据防泄密?奥赛系统早知道
  8. html自定义滚动条不占位,如何实现滚动条在各浏览器中不占用布局
  9. linux阻塞原语,Linux中的内存原语是什么?
  10. APP支付报错ALI40247解决方案