主要是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. jquery 笔记总结

    一.jquery 事件 <script type="text/javascript" src="/jquery/jquery.js"></sc ...

  2. IIS7.5 中启用rest服务,Delete、Put

    WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...

  3. python 安装pycurl

    yum install libghc-gnutls-dev opnssl nss -y 126 yum install libghc-gnutls-dev -y 127 yum install htt ...

  4. git 无法提交空目录

    git不能提交子文件夹?   空目录无法add,在最里面的目录下加上随便加上一个txt就可以了

  5. TCP滑动窗口协议

    TCP的首部中​有一个很重要的字段就是16位长的窗口大小,它出现在每一个TCP数据报中,配合32位的确认序号,用于向对端通告本地socket的接收窗口大小.也就是说,如果本地socket发送一个TCP ...

  6. mysql流程函数if之类

    表名: salary ———————— userid | salary| ———————— 1 | 1000 2 | 2000 3 | 3000 4 | null ... IF(value, t, f ...

  7. 3种启动tornado的方式

    r"""A non-blocking, single-threaded HTTP server. 翻译: 一个非阻塞的单线程HTTP服务器 A server is def ...

  8. 解决maven jmxtools 缺失的问题

    原因:有版权,所以maven仓库基本都下架了jmxtool. 目前可用的,我就找到了wso2这家,配置如下: <project xmlns="http://maven.apache.o ...

  9. substitute 命令与 global 命令

    他们是很强大的EX命令: substitute的格式: :[range]s[ubstitute]/{pattern}/{string}/{flags} 其中的patttern 指的是正则表达式的匹配: ...

  10. Lucene系列五:Lucene索引详解(IndexWriter详解、Document详解、索引更新)

    一.IndexWriter详解 问题1:索引创建过程完成什么事? 分词.存储到反向索引中 1. 回顾Lucene架构图: 介绍我们编写的应用程序要完成数据的收集,再将数据以document的形式用lu ...