重新认识Activity(一)生命周期方法(系统垃圾回收机制和onSaveInstanceState)

来源:互联网 发布:视频点播php源码 编辑:程序博客网 时间:2024/05/01 16:09

        说来惭愧,从工作到现在,学习Android已有一年,但面对activity这个最常用的组件仍然许多疑问,遂决定好好看一遍关于activity的官方api,把遗落的知识再次整理一遍。

       首先当然是贴出最经典的活动状态图,直接从API上截的

      

       其中每个状态的改变引发的生命周期方法调用就不提了。其实,这篇文章主要想要讨论一下图片左边这一条path 。

       一般情况下,当我们的activity失去焦点但还可见时,onPause方法就会被调用,这时acitity是一个什么状态呢?

         当然它已经不在栈顶了,而且当系统内存很少时它有可能被回收,但它确实保留了自己的所有状态和数据,这时:

         如果将它重新置于栈顶,那么它的数据将得以保留。

          如果不幸被系统kill掉了,那么再次可见时onCreate将被调用,这也意味着它将失去一些原本的数据(注意是一些,而不是所有,因为页面控件的信息系统会帮我们自动保存,后面会提到)。

          这倒没什么玄妙,相信很多人已经了解了,但是这个问题却往往被大部分人有意无意的忽略。比如下面一个常见的业务逻辑,一个注册过程需要分很多页完成,中间的页可以跳到下一页继续填写,也可以返回上一页做出修改,这意味着我们的"上一页"必须保存当前的数据以备用户返回时使用,一般的做法时跳转页面时不finish当前页面,这当然可以而且绝大部分时候是不会出错的,这是因为即使activity处于不可见状态也不是那么容易就被系统回收,但作为一个严谨的业务逻辑还是希望能够避免这种情况出现的。

          解决的方式就是调用onSaveInstanceState()

         在上述的情形下,实际的activity实例已经被销毁,但是系统仍然记得它的存在,当用户返回到它的时候,系统会创建出一个新的实例来代替它,这里需要利用旧实例被销毁时候存下来的数据。这些数据被称为“instance state”,是一个存在Bundle对象中的键值对集合。
         缺省状态下,系统会把每一个View对象保存起来(比如EditText对象中的文本,ListView中的滚动条位置等),即如果activity实例被销毁和重建,那么不需要你编码,layot状态会恢复到前次状态。   

          但如果要存储额外的数据的话,就需要调用这个函数,这个函数的使用非常简单



这里要注意,onSaveInstanceState()中的super.onSaveInstanceState(outState);不能删除

系统会在用户离开activity的时候调用这个函数,并且传递给它一个Bundle object,如果系统稍后需要重建这个activity实例,它会传递同一个Bundle object到onRestoreInstanceState() 和 onCreate() 方法中去

        onSaveInstanceState的调用时机


最后补充一句 :activity会在以下三种情况下销毁:1、调用activity调用finish,点击back键
                                                                                                 2、activity调用利润onPause和onStop方法后被系统强制回收
                                                                                                 3、配置信息改变比如横竖屏切换
在上面三种情况下,只有2和3系统才能在即使是销毁它的状况下记住它,而onSaveInstanceState也才是有效的
0 0