主要是bundle   这个參数

參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975

学习Activity的生命周期,我们知道,当Activity进入到paused或者stopped状态后,这个Activity的状态仍然保存着。

由于这个Activity对象仍然保存在内存中。它的全部信息和状态仍然是存在的。当这个Activity再次返回到前台是,它仍然保持着离开时候的样子。

然而。假设Activity进入到了后台。系统为了回收内存,有可能会去销毁该Activity,那么。当用户通过导航返回的时候。系统就不能简单的去恢复这个Activity,而是会又一次创建这个Activity对象。可是对于普通用户来说,他并不知道系统销毁了Activity并又一次创建它,因此,可能希望该Activity保存和他离开时候一样的状态。

在这样的情况下,您能够通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息。

[java] view
plain
 copy

  1. @Override
  2. protected void onSaveInstanceState(Bundle outState) {
  3. super.onSaveInstanceState(outState);
  4. Log.d("roamer", "onSaveInstanceState");
  5. }
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. Log.d("roamer", "onCreate");
  11. }
  12. @Override
  13. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  14. super.onRestoreInstanceState(savedInstanceState);
  15. Log.d("roamer", "onRestoreInstanceState");
  16. }

通过onSaveInstanceState()方法传递进来的Bundle对象中,存入我们想要保存的东西。然后。当Activity被又一次创建的时候。我们就能够通过onCreate()或者onRestoreInstanceState()方法的Bundle对象。来获得我们之前存入的数据。至于Bundle的使用方法,就不多说了。

步骤例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTG9uZWx5Um9hbWVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">

注意:并非每一次Activity销毁。系统都回去回调onSaveInstanceState()方法,我们是我们自己finish掉该Activity,那么onSaveInstanceState()方法就不会被调用。

而且系统调用onSaveInstanceState()方法的时机通常是在onStop()之前,可是也有可能是onPause之前。

而且系统调用onRestoreInstanceState()的时机。是在onStart()之后,onResume之前。


Activity状态保存的默认机制

然而。即使我们不重写onSaveInstanceState()方法。Activity对于onSaveInstanceState()方法的默认实现。仍然会帮我们恢复某些状态。详细来说,默认的实现会帮我们调用该Activity布局中每一个View的onSaveInstanceState()方法。View中的onSaveInstanceState()方法体例如以下:
[java] view
plain
 copy

  1. //View的onRestoreInstanceState()方法
  2. //该方法同意每一个View提供自己须要保存的信息
  3. @Override
  4. protected void onRestoreInstanceState(Parcelable state) {
  5. // TODO Auto-generated method stub
  6. super.onRestoreInstanceState(state);
  7. }

差点儿Android框架中的每个widget都适当的实现了这种方法,这样不论什么可见的UI更改活动在又一次创建时自己主动保存和恢复。

比如,EditText部件保存用户输入的不论什么文本,CheckBox部件保存是否被选中。

我们唯一要做的工作就是提供一个惟一的ID(android:ID属性)为每个widget保存其状态。假设一个部件没有一个ID,则系统不能保存其状态。

当然,假设在某些特殊的情况下,你不须要某个View自己主动保存和恢复他的状态。那么你能够设置View的属性android:saveEnabled为false,或者调用setSaveEnabled()方法。

虽然系统帮我们实现了UI组建的自己主动保存和恢复,可是有时候也须要去保存和恢复一些其它的成员变量。在这样的情况下。记得重写onSaveInstanceState()和onRestoreInstanceState()方法是。记得带上super方法的实现,由于那里就是系统UI组件自己主动保存和恢复的默认实现。

注意:由于onSaveInstnceState()方法并非Activity销毁前一定被运行,所以你最好只保存与Activity状态相关的信息(UI状态)。你不应该去保存那些持久化的数据,那些持久化的数据应该放到onPause方法里面去运行(比方将数据存储到数据库中)。

測试Activity状态保存的方法

Activity调用onSaveInstanceState()方法时机还好,可是调用onRestoreInstanceState()就有点不太好控制。由于等到系统内存不够去销毁Activity也是比較难以控制的。所以我们能够用以下的办法,来測试Activity的状态保存。

就是旋转设置。让屏幕方向变化(当然前提是你没有锁定设置的旋转功能。Activity也没有设置屏幕方向)。当屏幕方向变化时,系统为了新的屏幕配置寻找替代资源,会销毁和重建Activity。

activity的状态保存,我们最基本的问题有三点:
1.onSaveInstanceState这种方法什么时候被运行,由于他不是必须的,不是activity生命周期中必须的流程

onSaveInstanceState() 仅仅有在系统即将要自己主动清理销毁Activity或Fragment前才会调用,

换句话说:你自己finish。他肯定不会调用的,必须是系统自己触发的,

比方

1, 因为重力感应 手机从竖屏变为横屏,

2, 手机点击Home键和长按Home键

3, 点击电源键锁屏时

4, 从当前Activity跳到还有一个Activity

5, 应用内存不足即将自己主动销毁时

2.onSaveInstanceState他保存的数据是持有化的。还是永久性的呢

onSaveInstanceState()  这种方法适合暂时保存一些非永久性的数据.假设要持久化保存数据,就要将操作放在onStop(),
onDestroy()这些方法中去

这样来看onSaveInstanceState()的作用就是:
onSaveInstanceState()  适合的是当前Activity或者Fragment一旦被系统自己销毁,应用还能在这之前保存一些必要的数据,
而且用户的操作非常快又回到当前这个页面,这个时候数据并没有丢失,还能最大程度的恢复之前状态.这就是这种方法最大的意义

3.怎么复写的问题,也就是怎么自己保存自己的数据了,使用的是bundle模式,也即是key-value模式了
由于在android的设计中中。这个函数的基本的作用是用来保存UI状态的,如今怎么去保存一些自己的数据呢
保存:
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
String content = etCon.getText().toString();
outState.putString("inputCon", content);
}

取出来:

@Override
public void onViewStateRestored(Bundle savedInstanceState){
<span style="white-space:pre"> </span>super.onViewStateRestored(savedInstanceState);
<span style="white-space:pre"> </span>//恢复之前输入框的内容
<span style="white-space:pre"> </span>if(savedInstanceState != null){
<span style="white-space:pre"> </span>etCon.setText(savedInstanceState.getString("inputCon", ""));
}
}


状态保存基本的使用除了横竖屏切换。在 fragment替换的时候能够用来解决花屏的问题


Android基础部分再学习---activity的状态保存的更多相关文章

  1. Android基础相关面试问题-activity面试问题(生命周期,任务栈,启动模式,跳转协议,启动流程)

    关于Android的一些面试题在15年就已经开了这个专栏了,但是一直木有坚持收集,而每次面对想要跳槽时大脑一片空白,也有些恐惧,因为毕境面试都是纯技术的沟通,要想让公司对你的技术能有所认可会全方位的进 ...

  2. Android 基础 二 四大组件 Activity

    Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...

  3. Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  4. Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...

  5. Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...

  6. Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  7. Android Activity中状态保存机制

    在Activity中保存用户的当前操作状态,如输入框中的文本,一般情况下载按了home键后,重新进入文本框中的东西会丢下,所以我们要保存当前页面信息,如在写短信的时候接到一个电话,那么当你接电话的时候 ...

  8. java基础知识再学习--集合框架-对象的强、软、弱和虚引用

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/53092 本文 ...

  9. java基础知识再学习--maven

    maven 下载安装: Eclipse中创建maven项目: 查询jar包的坐标:search.maven.org 添加完一个jar包的依赖以后,这个jar包所依赖的其他jar包也被导入到项目的bui ...

随机推荐

  1. azkaban安装

    1.下载:git clone https://github.com/azkaban/azkaban.git 2.编译:./gradlew build -x test 3. 创建目录并拷贝 mkdir ...

  2. c# 自动计算字符串的宽度

    测试代码: string str = "字符串"; var width = TextRenderer.MeasureText(str, this.Font); var width2 ...

  3. 【转】使用Maven的一些小建议,希望你能喜欢

    搭建私有仓库 Maven的仓库是用来存放Maven工程依赖的包的(通常为jar和pom,war包也可以依赖,在一些很复杂的项目中才能用到).仓库分为三种:中央仓库.第三方仓库.本地仓库. 中央仓库 由 ...

  4. T-SQL 错误状态

    MS Windows Error Messages Code Error Message 0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文 ...

  5. 【转】MySQL分库分表数据迁移工具的设计与实现

    一.背景 MySQL作为最流行的关系型数据库产品之一,当数据规模增大遭遇性能瓶颈时,最容易想到的解决方案就是分库分表.无论是进行水平拆分还是垂直拆分,第一步必然需要数据迁移与同步.由此可以衍生出一系列 ...

  6. Qt之QLocalSocket

    简述 QLocalSocket类提供了一个本地socket. 在Windows中,这是一个命名管道:在Unix中,这是一个本地网域socket. 如果发生错误,socketError()会返回错误的类 ...

  7. java从字符串中提取数字

    string类函数的补充说明: trim()方法返回调用字符串对象的一个副本,但是所有起始和结尾的空格都被删除了,例子如下:String s=" Hello World ".tri ...

  8. Selenium常用操作汇总二——如何操作cookies(转)

    Web 测试中我们经常会接触到Cookies,一个Cookies主要属性有”所在域.name.value.有效日期和路径",下面来讲一下怎么操作Cookies. import java.ut ...

  9. Python之collections.defaultdict

    转自:http://www.jb51.net/article/88147.htm

  10. IT 运营架构杂谈【前言】

    [ 什么是IT 服务 ?]   OGC官方的ITIL 服务定义: 中文定义:实施和管理 IT 服务,满足业务的需要.IT 服务管理由IT 服务提供方通过人员.流程和信息技术的适当组合而进行.   [ ...