Android基础部分再学习---activity的状态保存
主要是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()回调方法来恢复这些信息。
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- Log.d("roamer", "onSaveInstanceState");
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.d("roamer", "onCreate");
- }
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- Log.d("roamer", "onRestoreInstanceState");
- }
通过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状态保存的默认机制
- //View的onRestoreInstanceState()方法
- //该方法同意每一个View提供自己须要保存的信息
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- // TODO Auto-generated method stub
- super.onRestoreInstanceState(state);
- }
差点儿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状态保存的方法
onSaveInstanceState() 仅仅有在系统即将要自己主动清理销毁Activity或Fragment前才会调用,
换句话说:你自己finish。他肯定不会调用的,必须是系统自己触发的,
比方
1, 因为重力感应 手机从竖屏变为横屏,
2, 手机点击Home键和长按Home键
3, 点击电源键锁屏时
4, 从当前Activity跳到还有一个Activity
5, 应用内存不足即将自己主动销毁时
2.onSaveInstanceState他保存的数据是持有化的。还是永久性的呢
onDestroy()这些方法中去
而且用户的操作非常快又回到当前这个页面,这个时候数据并没有丢失,还能最大程度的恢复之前状态.这就是这种方法最大的意义
@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", ""));
}
}
Android基础部分再学习---activity的状态保存的更多相关文章
- Android基础相关面试问题-activity面试问题(生命周期,任务栈,启动模式,跳转协议,启动流程)
关于Android的一些面试题在15年就已经开了这个专栏了,但是一直木有坚持收集,而每次面对想要跳槽时大脑一片空白,也有些恐惧,因为毕境面试都是纯技术的沟通,要想让公司对你的技术能有所认可会全方位的进 ...
- Android 基础 二 四大组件 Activity
Activity Intent IntentFilter 一理论概述 一. Activity 用来提供一个能让用户操作并与之交互的界面. 1.1 启动 startActivity(Intent int ...
- Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)
1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)
一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...
- Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)
1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...
- Android Activity中状态保存机制
在Activity中保存用户的当前操作状态,如输入框中的文本,一般情况下载按了home键后,重新进入文本框中的东西会丢下,所以我们要保存当前页面信息,如在写短信的时候接到一个电话,那么当你接电话的时候 ...
- java基础知识再学习--集合框架-对象的强、软、弱和虚引用
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/53092 本文 ...
- java基础知识再学习--maven
maven 下载安装: Eclipse中创建maven项目: 查询jar包的坐标:search.maven.org 添加完一个jar包的依赖以后,这个jar包所依赖的其他jar包也被导入到项目的bui ...
随机推荐
- MVC教程五:Action方法的返回类型
MVC中的Action方法的返回值一般有以下几种: 类型 s说明 EmptyResult 不进行任何操作 ContentResult 将指定内容作为文本输出 JsonResult 输出JSON字符串 ...
- Mongo的备份和恢复(mongodump 和mongorestore )
http://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html --备份单个表mongodump -u superuser -p 1 ...
- underscore-1.8.3-analysis.js
// Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud an ...
- r table
一.table 函数对应的就是统计学中的列联表,是一种记录频数的方法,对于统计来说有非常重要的应用,下面的例子都是针对维数为2的情况举例,多维的情况是类似的 下面看一个例子: > ct < ...
- windows下QJson的编译和安装
本文是编译安装Qjson过程中遇到的问题解决过程.主要参照网上资料和自己试验得到. 关于Qjson的用处参照:Qt 学习之路 2(63):使用 QJson 处理 JSON Qjson clone地址: ...
- 自然语言交流系统 phxnet团队 创新实训 项目博客 (十四)
项目技术借鉴报告: 一.服务器端(Server) 1.分词 分词使用的是庖丁分词.使用盘古分词词库和词素作为辅助.其中包括下载Jar包并且使用. 2.人工神经网络 以网上已有的初级网络为蓝图,结合机器 ...
- USB2.0学习笔记连载(九):USB设备驱动的安装
在第一次插入USB设备时(笔者用的是自己做的USB最小系统来测试),插入电脑后,在设备管理器中会显示 未知设备,如下图所示: 点击右键,选择属性,在详细信息中可以看到硬件ID以及PID等,如下图所示. ...
- redis、kafka、rabittMQ对比
本文不对三者之间的性能进行对比,只是从三者的特性上区分他们,并指出三者的不用应用场景. 1.publish/subscribe 发布订阅模式如下图所示可以具有多个生产者和发布者,redis.kafka ...
- Pandas DataFrame 函数应用和映射
apply Numpy 的ufuncs通用函数(元素级数组方法)也可用于操作pandas对象: 另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上.Dataframe的apply方法即可实现 ...
- e825. 当JSplitPane改变大小时分配空间
The weight of a split pane controls the behavior of the divider when the split pane is resized. If t ...