• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android基础部分再学习---activity的状态保存

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

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Android基础部分再学习---activity的状态保存等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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


学习Activity的生命周期,我们知道,当Activity进入到paused或者stopped状态后,这个Activity的状态仍然保存着。因为这个Activity对象仍然保存在内存中,它的所有信息和状态仍然是存在的,当这个Activity再次返回到前台是,它仍然保持着离开时候的样子。

然而,如果Activity进入到了后台,系统为了回收内存,有可能会去销毁该Activity,那么,当用户通过导航返回的时候,系统就不能简单的去恢复这个Activity,而是会重新创建这个Activity对象。但是对于普通用户来说,他并不知道系统销毁了Activity并重新创建它,因此,可能希望该Activity保存和他离开时候一样的状态。

在这种情况下,您可以通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息。

  1. @Override
  2. protectedvoidonSaveInstanceState(BundleoutState){
  3. super.onSaveInstanceState(outState);
  4. Log.d("roamer","onSaveInstanceState");
  5. }
  6.  
  7. @Override
  8. protectedvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. Log.d("roamer","onCreate");
  12. }
  13.  
  14. @Override
  15. protectedvoidonRestoreInstanceState(BundlesavedInstanceState){
  16. super.onRestoreInstanceState(savedInstanceState);
  17. Log.d("roamer","onRestoreInstanceState");
  18. }
    通过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()方法体如下:</div>  </div>
    1. //View的onRestoreInstanceState()方法
    2. //该方法允许每个View提供自己需要保存的信息
    3. @Override
    4. protectedvoidonRestoreInstanceState(Parcelablestate){
    5. //TODOAuto-generatedmethodstub
    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的状态保存。</div> 就是旋转设置,让屏幕方向变化(当然前提是你没有锁定设置的旋转功能,Activity也没有设置屏幕方向)。当屏幕方向变化时,系统为了新的屏幕配置寻找替代资源,会销毁和重建Activity。</div>  </div> activity的状态保存,我们最主要的问题有三点:</div> 1.onSaveInstanceState这个方法什么时候被执行,因为他不是必须的,不是activity生命周期中必须的流程</div>

      onSaveInstanceState() 只有在系统即将要自动清理销毁Activity或Fragment前才会调用,

      换句话说:你自己finish,他肯定不会调用的,必须是系统自己触发的,

      比如

      1, 由于重力感应 手机从竖屏变为横屏,

      2, 手机点击Home键和长按Home键

      3, 点击电源键锁屏时

      4, 从当前Activity跳到另一个Activity

      5, 应用内存不足即将自动销毁时

      2.onSaveInstanceState他保存的数据是持有化的,还是永久性的呢</div> onSaveInstanceState()这个方法适合临时保存一些非永久性的数据.如果要持久化保存数据,就要将操作放在onStop(), onDestroy()这些方法中去</div>  </div> 这样来看onSaveInstanceState()的作用就是:</div> onSaveInstanceState()适合的是当前Activity或者Fragment一旦被系统自己销毁,应用还能在这之前保存一些必要的数据, 并且用户的操作很快又回到当前这个页面,这个时候数据并没有丢失,还能最大程度的恢复之前状态.这就是这个方法最大的意义</div>  </div> 3.怎么复写的问题,也就是怎么自己保存自己的数据了,使用的是bundle模式,也即是key-value模式了</div> 因为在android的设计中中,这个函数的主要的作用是用来保存UI状态的,现在怎么去保存一些自己的数据呢</div> 保存:</div>
      @Override
      public void onSaveInstanceState(Bundle outState){
             super.onSaveInstanceState(outState);
             String content = etCon.getText().toString();
             outState.putString("inputCon", content);
      }
      取出来:</div>
      @Override
      public void onViewStateRestored(Bundle savedInstanceState){
      	super.onViewStateRestored(savedInstanceState);
      	//恢复之前输入框的内容
      	if(savedInstanceState != null){
      		etCon.setText(savedInstanceState.getString("inputCon", ""));
      	}
      }
      </div>  </div> 状态保存主要的使用除了横竖屏切换,在 fragment替换的时候可以用来解决花屏的问题。</div>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-228.1.2 Android中的13种Drawable小结 Part 2
  • 2017-05-26Android MotionEvent详解
  • 2017-05-26redis lru实现策略
  • 2017-05-26【原】tinker dex文件格式的dump工具tinker-dex-dump,dextinker-dex-dump
  • 2017-05-26BroadcastReceiver--Android广播机制,broadcastreceiver
  • 2017-05-26Android studio 百度地图开发(2)地图定位
  • 2017-05-26DrawerLayout的openDrawer()和closeDrawer()方法,drawerlayout
  • 2017-05-26APP级别处理未捕获异常,APP级别处理捕获
  • 2017-05-26Android中Intent在Activity之间传递对象[Serializable或Parcelable]
  • 2017-05-26自定义图片轮播框架。也是作为依赖库使用的哦,自定义框架

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Linux GSO逻辑分析
    • Android面试题(2),android面试题
    • andriod 读取通讯录,andriod通讯录
    • Install Battery Historian,batteryhistorian
    • 二层(链路层)数据包发送过程分析
    • 点击文本改变改行背景色,弹出对话框,改行背景
    • 【Android开发】完美解决Android完全退出程序,开发android
    • Android:应用宝省流量更新
    • 第一节 搭建开发环境,第一节搭建开发
    • 理解android中ListFragment和Loader,androidlistfragment

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有