前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android基础部分再学习---activity的状态保存

Android基础部分再学习---activity的状态保存

作者头像
wust小吴
发布2019-07-08 17:50:21
9540
发布2019-07-08 17:50:21
举报
文章被收录于专栏:风吹杨柳风吹杨柳

主要是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

@Override

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

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

过程如下图:

注意:并不是每一次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状态的,现在怎么去保存一些自己的数据呢

保存:

代码语言:javascript
复制
@Override
public void onSaveInstanceState(Bundle outState){
       super.onSaveInstanceState(outState);
       String content = etCon.getText().toString();
       outState.putString("inputCon", content);
}

取出来:

代码语言:javascript
复制
@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替换的时候可以用来解决花屏的问题

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Activity状态保存的默认机制
  • 测试Activity状态保存的方法
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档