保存Activity的状态
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的全部信息和状态数据不会消失, 当activity又一次回到前台之后, 全部的改变都会得到保留.
可是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 假设之后这个activity又一次回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发人员能够覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的參数, 开发人员能够将状态数据存储到这个Bundle对象中,
这样即使activity被系统摧毁, 当用户又一次启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实參传递给onCreate()方法, 开发人员能够从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.
- public static final int SECOND_ACTIVITY = 0;
- private String temp;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 从savedInstanceState中恢复数据, 假设没有数据须要恢复savedInstanceState为null
- if (nul!=savedInstanceStatel&&savedInstanceState.containKey("temp")) {
- temp = savedInstanceState.getString("temp");
- System.out.println("onCreate: temp = " + temp);
- }
- }
- public void onResume() {
- super.onResume();
- temp = "xing";
- System.out.println("onResume: temp = " + temp);
- // 切换屏幕方向会导致activity的摧毁和重建
- if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- System.out.println("屏幕切换");
- }
- }
- // 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法
这样就保存到了Bundle中,即使Activity被kill掉了,Bundle仍然存在 - @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putString("temp", temp);
- }
- }
须要注意的是, onSaveInstanceState()方法并非一定会被调用的, 由于有些场景是不须要保存状态数据的. 比方用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 假设调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前.
onSaveInstanceState()方法的默认实现
假设开发人员没有覆写onSaveInstanceState()方法, 此方法的默认实现会自己主动保存activity中的某些状态数据, 比方activity中各种UI控件的状态. android应用框架中定义的差点儿全部UI控件都恰当的实现了onSaveInstanceState()方法, 因此当activity被摧毁和重建时, 这些UI控件会自己主动保存和恢复状态数据. 比方EditText控件会自己主动保存和恢复输入的数据, 而CheckBox控件会自己主动保存和恢复选中状态.
开发人员仅仅须要为这些控件指定一个唯一的ID(通过设置android:id属性就可以), 剩余的事情就能够自己主动完毕了. 假设没有为控件指定ID, 则这个控件就不会进行自己主动的数据保存和恢复操作.
由上所述, 假设开发人员须要覆写onSaveInstanceState()方法, 通常会在第一行代码中调用该方法的默认实现: super.onSaveInstanceState(outState).
是否须要覆写onSaveInstanceState()方法
既然该方法的默认实现能够自己主动的保存UI控件的状态数据, 那什么时候须要覆写该方法呢?
假设须要保存额外的数据时, 就须要覆写onSaveInstanceState()方法. 如须要保存类中成员变量的值(见上例).
onSaveInstanceState()方法适合保存什么数据
因为onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 比如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法仅仅适合保存瞬态数据, 比方UI控件的状态, 成员变量的值等.
引发activity摧毁和重建的其它情形
除了系统处于内存不足的原因会摧毁activity之外, 某些系统设置的改变也会导致activity的摧毁和重建. 比如改变屏幕方向(见上例), 改变设备语言设定, 键盘弹出等.
保存Activity的状态的更多相关文章
- 如何保存 Activity 的状态?
Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能.一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存 ...
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)
一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android中activity保存数据和状态在哪个方法实现
以前只知道在Activity销毁之前,要把数据保存在 onSaveInstanceState(Bundle)方法中,后来学习了别人的微博,学到了很多细节问题,所以整理了一下,希望能帮到大家. 如果看官 ...
- 【转】android笔记--保存和恢复activity的状态数据
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会 ...
- Android基础部分再学习---activity的状态保存
主要是bundle 这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知 ...
- Android 保存和恢复activity的状态数据
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会 ...
- android中正确保存view的状态
英文原文: http://trickyandroid.com/saving-android-view-state-correctly/ 转载此译文须注明出处. 今天我们聊一聊安卓中保存和恢复view状 ...
随机推荐
- Jquery 实现列表的显示和隐藏
本人github源码下载地址:https://github.com/liuyanpeng521/ListChange.git
- 国内外知名IT科技博客
国内 1.36氪(www.36kr.com): 目前国内做的最风生水起的科技博客,以介绍国内外互联网创业新闻为主的博客网站,自己建立有36Tree互联网创业融投资社区.36氪的名字源于元素周期 表的第 ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- Cesium学习笔记(四)Camera
http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相机控制场景中的视野.操作相机的方法有很多,如旋转,缩放,平移和飞到目的地 ...
- 单实例redis分布式锁的简单实现
redis分布式锁的基本功能包括, 同一刻只能有一个人占有锁, 当锁被其他人占用时, 获取者可以等待他人释放锁, 此外锁本身必须能超时自动释放. 直接上java代码, 如下: package com. ...
- B.1 接口
几乎所有要学习的接口都位于 System.Collections.Generic 命名空间.图B-1展示了.NET4.5以前主要接口间的关系,此外还将非泛型的 IEnumerable 作为根接口包括了 ...
- Error: Registry key 'Software\JavaSoft\Java Runtime has value '1.8', but '1.7' is
cmd下输入 java命令时出现该错误: Error: Registry key 'Software\JavaSoft\Java Runtimehas value '1.8', but '1.7' i ...
- 五、Scrapy中Item Pipeline的用法
本文转载自以下链接: https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html https://doc.scra ...
- Django——4 模板标签 模板的继承与引用
Django 模板标签 常用标签 模板的继承与引用 模板标签 标签在渲染的过程中提供任意的逻辑 标签语法: 由%}和 {% 来定义的,例如:{%tag%} {%endtag%} 这个定义是刻意模糊的. ...
- SSL常用专业缩略语汇总
JKS - Java KeyStore JAVA密钥库 OCSP - Online Certificate Status Protocol证书在线状态协议. SAN - Subject Alterna ...