activity中的onPause()和onSaveInstanceState()解析

    当用户在开启一个新activity时,当前的activity可能在内存中处于中止状态也可能因为新activity须要更多内存而被系统杀掉了,但不论怎样,当用户在新activity上按返回键时,他但愿看到的是原先的activity的界面。原先的activity若是是被从新建立,那么它要恢复到用户最后看到它的样子。那么咱们怎么作呢?其实也不难,跟据上一节所述,在onPause()或onStop()或onDestyroy()中保存必要的数据就好了。可是如今google又冒出一个新的东西:onSaveInstanceState(),观其名可知其意:它是专门用来保存实例状态的,这个“实例”不是指的activity对象,而是它所在的进程,由于activity的销毁是由于它所在的进程被杀而形成的。onSaveInstanceState()是在系统感受须要杀死activity时调用的,它被传入一个参数:Bundle,这个Bundle能够被认为是个map,字典之类的东西,用”键-值”来保存数据。android

    如今又叫人蛋疼了:不是能够在onPause()中保存数据吗?为何又搞出这样一个家伙来?它们之间是省木关系呢?原来onSaveInstanceState()的主要目的是保存activity的状态有关的数据,当系统在杀死activity时,若是它但愿activity下次出现的样子跟如今彻底同样,那么它就调用这个onSaveInstanceState(),不然就不调用。因此要明白这一点:onSaveInstanceState()并非永远都会调用。好比,当用户在一个activity上按返回时,就不会调用,由于用户此时明确知道这个activity是要被销毁的,并不指望下次它的样子跟如今同样(固然开发者可使它保持临死时的表情,你非要这样作,系统也没办法),因此就不用调用onSaveInstanceState()。如今应该明白了:在onPause(),onStop()以及onDestroy()中须要保存的是那些须要永久化是数据,而不是保存用于恢复状态的数据,状态数据有专门的方法:onSaveInstanceState()。数据保存在一个Bundle中,Bundle被系统永久化。当再调用activity的onCreate()时,原先保存的bundle就被传入,以恢复上一次临死时的模样,若是上次死时没有保存Bundle,则为null。网络

      还没完呢,若是你没有实现本身的onSaveInstanceState(),可是activity上控件的样子可能依然能被保存并恢复。原来activity类已实现了onSaveInstanceState(),在onSaveInstanceState()的默认实现中,会调用全部控件的相关方法,把控件们的状态都保存下来,好比EditText中输入的文字,CheckBox是否被选中等等。然而不是全部的控件都能被保存,这取决于你是否在layout文件中为控件赋了一个名字(android:id)。有名的就存,无名的无论。测试

      既然有现成的可用,那么咱们到底还要不要本身实现onSaveInstanceState()?这得看状况了,若是你本身的派生类中有变量影响到UI,或你程序的行为,固然就要把这个变量也保存了,那么就须要本身实现,不然就不须要,但大多数状况确定须要本身实现一下下了。对了,别忘了在你的实现中调用父类的onSaveInstanceState()。google

注:因为onSaveInstanceState()并非每次销毁时都会调用,因此不要在其中保存那些须要永久化的数据,执行保存那些数据的最好地方是:onPause()中。spa

    测试你程序的状态恢复能力的最好方法是:旋转屏幕,每当屏幕的方向改变时,当前的activity就会被系统销毁,而后从新建立(应该是进程被关闭!――不会吧?效率不高哦)。对象

    (以上内容收集与网络)进程

相关文章
相关标签/搜索