主要是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. MVC教程五:Action方法的返回类型

    MVC中的Action方法的返回值一般有以下几种: 类型 s说明 EmptyResult 不进行任何操作 ContentResult 将指定内容作为文本输出 JsonResult 输出JSON字符串 ...

  2. Mongo的备份和恢复(mongodump 和mongorestore )

    http://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html --备份单个表mongodump -u superuser -p 1 ...

  3. underscore-1.8.3-analysis.js

    // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud an ...

  4. r table

    一.table 函数对应的就是统计学中的列联表,是一种记录频数的方法,对于统计来说有非常重要的应用,下面的例子都是针对维数为2的情况举例,多维的情况是类似的 下面看一个例子: > ct < ...

  5. windows下QJson的编译和安装

    本文是编译安装Qjson过程中遇到的问题解决过程.主要参照网上资料和自己试验得到. 关于Qjson的用处参照:Qt 学习之路 2(63):使用 QJson 处理 JSON Qjson clone地址: ...

  6. 自然语言交流系统 phxnet团队 创新实训 项目博客 (十四)

    项目技术借鉴报告: 一.服务器端(Server) 1.分词 分词使用的是庖丁分词.使用盘古分词词库和词素作为辅助.其中包括下载Jar包并且使用. 2.人工神经网络 以网上已有的初级网络为蓝图,结合机器 ...

  7. USB2.0学习笔记连载(九):USB设备驱动的安装

    在第一次插入USB设备时(笔者用的是自己做的USB最小系统来测试),插入电脑后,在设备管理器中会显示 未知设备,如下图所示: 点击右键,选择属性,在详细信息中可以看到硬件ID以及PID等,如下图所示. ...

  8. redis、kafka、rabittMQ对比

    本文不对三者之间的性能进行对比,只是从三者的特性上区分他们,并指出三者的不用应用场景. 1.publish/subscribe 发布订阅模式如下图所示可以具有多个生产者和发布者,redis.kafka ...

  9. Pandas DataFrame 函数应用和映射

    apply Numpy 的ufuncs通用函数(元素级数组方法)也可用于操作pandas对象: 另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上.Dataframe的apply方法即可实现 ...

  10. e825. 当JSplitPane改变大小时分配空间

    The weight of a split pane controls the behavior of the divider when the split pane is resized. If t ...